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

标签 java instantiation

问题

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

  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”对象,因为 Warrior 最初并未在 Army 类中实例化。

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()

您会注意到它如何在 Warrior 的构造函数中使用变量“myArmy”。这只是在实例化 Horse 时传递的 Army 对象。

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 对象的开始就正确的,所以我首先想检查它是否已经实例化,然后再尝试从一个单独的对象引用它。

这是我遇到麻烦的地方。每当我尝试检查一个 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

我尝试过的

我认为创建的 Warrior 对象可能不是 Army 的成员(这是正确的术语,对吗?),所以我尝试将“.horse”添加到该行中,但得到了类似的结果。

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

我什至尝试添加一个 boolean 值,当一个 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 对象是否已经实例化以便我可以从其他对象引用它?

最佳答案

如果我正确理解了你的问题,你需要将以下内容添加到你的 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()

希望对您有所帮助。

关于java - 如何检查对象是否已经创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40393982/

相关文章:

java - java中实例化泛型类型时出现InstantiationException

javascript - 对实例化时的 Backbone 模型验证感到困惑

java - 通过选项数组预测用户正在输入的内容

java - 如何优雅地处理 Jackson InvalidFormatException?

java - 我可以从 kindle Activity 内容应用程序读取和写入 kindle 文件系统上的文件吗?

java repaint() 和初始化对象

java - 多次递增计数器

java - 在 Java 中将文件从一个目录复制到另一个目录

c++ - 模板函数中默认参数的实例化点

php - 在 PHP 中实例化类的正确方法