2016-08-04 27 views
1

我有以下几个主要类别和主要方法:的Java传递两个对象到每个人在一个步骤

public class Main { 

Peter peter = new Peter(this); 
Tom tom = new Tom(this); 

    public static void main(String[] args) { 
     Main main = new Main(); 
     System.out.println(main.peter.tom); 
     System.out.println(main.tom.peter); 
    } 
} 

和下面的父类:

class Enemy { 
    //some variables 
} 

和下面的两个子类:

class Tom extends Enemy { 

    Enemy peter; 

    Tom(Main main) { 
     this.peter = main.peter; 
    } 
} 

class Peter extends Enemy { 

    Enemy tom; 

    Peter(Main main) { 
     this.tom = main.tom; 
    } 
} 

当两个打印方法运行在main方法中时,第一个打印方法返回null,因为Tom不是creat当时它被分配到Enemy tom。 为了解决这个问题,我没有在构造函数中分配TomPeterEnemy,而是在创建这两个对象之后分配了一个方法。 因此,更多的是这样的:

private void setEnemies(){ 
    peter.tom = tom; 
    tom.peter = peter; 
} 

当方法中的println方法调用之前,它完美的作品。 我的问题是:有没有办法在对象创建时设置敌人,所以在创建对象之后我不必调用单独的方法?

+1

请注意,您所描述的问题,是因为'彼得·彼得=新彼得(本);'是*不安全的出版物*的例子:你在'Main'被完全初始化之前,将'Main'引用传递给'Peter'的构造函数。这意味着'Peter'可以在处于有效状态之前开始使用'Main'做事情,因此可能会导致意外和不可预测。 –

+0

我知道在我当前的项目中,我从另一个类的构造函数创建了'Peter'和'Tom'。我以这种方式发布它来简化代码。 –

+0

对于'RadioButton's,只有一个'RadioButtonGroup'被添加到他们的结构/作为工厂中完成同样的事情。然后RadioButtonGroup确保所有单选按钮相互关联, –

回答

6

简短的回答是:不,你不能。原因是你必须一次创建一个这样的实例;当你创建第一个时,第二个不存在,所以不能传递给第一个。

虽然它不应该是一个可怕的限制。你想为Enemy类添加void setEnemy(Enemy myEnemy)方法,然后为每个敌人调用它。例如:

Enemy peter = new Peter(); 
Enemy tom = new Tom(); 
peter.setEnemy(tom); 
tom.setEnemy(peter); 
1

由于您先后创建对象(Peter和Tom),您无法在创建对象时将它们设置。当创建第一个时,第二个仍然没有实例化。这样你不能将第二个(尚未创建)传递给第一个。如果你创造它像敌人彼得=新彼得();它将是不同实例的彼得对象,所以它仍然不会是你想要的

1

通常指的是一个仍然不存在的对象只能在尚未评估的函数中完成。在这里,Java 8可以提供帮助。

​​

当然在声明彼得和汤姆之间,彼得的敌人供应者也会返回null,但是这是由代码保证的。如果构造者仍然没有对敌人做任何事情。

2

您可以使用Domain driven design方法。我已经让你的例子更具通用性,向你展示它是如何工作的。

class Enemy { 
    Enemy enemy; 

    public Enemy createEnemy() { 
     Enemy enemy = new Enemy(); 
     enemy.enemy = this; 
     this.enemy = enemy; 
    } 
} 

class Peter extends Enemy { } 
class Tom extends Enemy { } 

你可以这样使用它,像这样:

Peter peter = new Enemy(); 
Tom tom = peter.createEnemy(); 
System.out.println(peter.enemy); // returns Tom 
System.out.println(tom.enemy); // returns Peter 
相关问题