如何检查是否已创建对象?

时间:2016-11-03 04:41:32

标签: java instantiation

问题

我有一个陆军类,它运行两次(由一个单独的驱动程序类)来创建两个军队。在该陆军类中,有以下语句可以从我拥有的其他类文件中创建新对象:

  public final Archer archer = new Archer(this);
  public final Catapult catapult = new Catapult(this);
  public final NCatapult ncatapult = new NCatapult(this); //Ninja catapult
  public final Ninja ninja = new Ninja(this);
  public final Horse horse = new Horse(this);
  public final Samurai samurai = new Samurai(this);

每个对象的构造函数都需要一个" Army"对象在构造函数方法参数中,因此在实例化中使用this关键字。

因此。在Horse课程的一个方法中,我创建了一个新的" Warrior"对象,因为战士最初没有在陆军阶级实例化。

private boolean warriorCreated = false;
  public void dismount(){
    if (!warriorCreated){
      Warrior warrior = new Warrior(myArmy);
      warriorCreated = true;
      myArmy.getOurArmyWindow().getTabbedPane().addTab("(Ethan)", new ImageIcon("images/warriorIcon.jpg"), warrior.genGetPanel()); //This is just adding the Warrior's tab to my GUI. It's not relevant to the problem.
    }
    ...//Some stuff to handle when the method is called and warriorCreated is true
    }//end dismount()

你会注意到它如何使用变量" myArmy"在战士的构造函数中。这只是在马被实例化时通过的陆军对象。

public Horse(Army armyInstance){ //A constructor that takes in whatever Army object called it
    myArmy = armyInstance;
  }

在所有不同的实例化对象中,我可以使用myArmy.getEnemyArmyInstance()方法访问另一个对方军队。我不想详细解释它是如何工作的,占用的空间比我已经多了,所以请相信我它的工作原理。

这意味着通常我可以通过调用类似Ninja enemyNinja = myArmy.getEnemyArmyInstance().ninja;的东西来引用对方军队实例化的对象(我可以替换" Ninja"以及我想要引用的任何其他对象)。

但是,因为Warrior对象是通过Horse类方法实例化的,而不是从每个Army对象的get-go实例化,所以我首先想要在尝试从单独的对象引用它之前检查它是否已经实例化。

这是我遇到麻烦的地方。每当我尝试检查Warrior对象是否已经实例化时,它在编译时会给我一个错误。

例如,请考虑以下检查:

public void checkForWarrior(){
if (myArmy.getEnemyArmyInstance().warrior != null){
  System.out.println("A warrior exists!");
}
else
  System.out.println("There is no warrior!");
}

它会抛出错误

error: cannot find symbol   
if (myArmy.getEnemyArmyInstance().warrior != null){
                                 ^
symbol:   variable warrior
location: class Army

我尝试过什么

我想也许创建的战士对象不是军队的成员(这是正确的术语,对吧?),所以我尝试添加" .horse"到该行只是为了得到类似的结果。

   if (myArmy.getEnemyArmyInstance().horse.warrior != null){
                                          ^
   symbol:   variable warrior
   location: variable horse of type Horse

我甚至尝试添加一个布尔值,当Warrior被实例化时会在Horse类中打开,然后再检查它。但没有骰子。

private boolean mounted = true; //This is in the Horse class and is set to
false when a Warrior is instantiated.

在其他课程中:

if (myArmy.getEnemyArmyInstance().horse.getMounted()){
Warrior enemy = myArmy.getEnemyArmyInstance().warrior;//Still gives me an
//error that it cannot find the variable warrior. (I tried adding .horse to
//this, too).

问题

从不是实例化它的Horse的对象中,我如何检查Warrior对象是否已经实例化,以便我可以从其他对象中引用它?

1 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,您需要将以下内容添加到Army课程中:

public Warrior warrior;

然后在你的Horse课程中:

  public void dismount(){
    if (myArmy.warrior == null){
      myArmy.warrior = new Warrior(myArmy);
      myArmy.getOurArmyWindow().getTabbedPane().addTab("(Ethan)", new ImageIcon("images/warriorIcon.jpg"), warrior.genGetPanel()); //This is just adding the Warrior's tab to my GUI. It's not relevant to the problem.
    }
    ...//Some stuff to handle when the method is called and warriorCreated is true
    }//end dismount()

我希望这会有所帮助。