Java – reference classes are constructed by classes

I am a web developer (game developer as a hobby) and I have seen myself using the following example several times (both are developing server architecture and video game development.) It looks really ugly, but I don't know if I have a job I will give an example in game development, because this is what I have noticed recently This is the RPG I've been working on Every time a battle is launched, the combat engine will form both sides of the combatants Each fighter sets an artificialligence object associated with a given fighter, which is responsible for indicating the movement of players who do not receive explicit commands:

public class Combatant {

    ArtificialIntelligence ai = null;

    public Combatant()
    {
        // Set other fields here.

        this.ai = new ArtificialIntelligence(this);
    }

}

Here's what I don't like: the internal intelligence takes action during construction, because it needs some combat areas to specify appropriate actions Therefore, for convenience, I keep the reference to the warfighter as a reference to the artificialligence object, but the object contains a reference to the AI object itself! It creates this strange recursion, but I don't know how to solve it AI objects need a lot of fields specific to combatants, so that's why I pass them in the whole object, but I don't like the object to include a reference field to the AI field contained in the upper combatant, which is contained in the upper AI class Is this a bad practice, or am I just thinking?

Solution

Although there is no "design" problem here, this is just a reference you pass - an important consideration is that all fields should be initialized before passing it to another class Otherwise, another class will access this class in a potentially inconsistent state This is sometimes called getting this "escape" from the constructor

Don't do that

public class BadCombatant {

    ArtificialIntelligence ai = null;
    String someField;

    public BadCombatant() {
        this.ai = new ArtificialIntelligence(this);
        // Don't do this - ArtificialIntelligence constructor saw someField as null
        someField = "something"; 
    }
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>