2016-08-04 60 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 
相關問題