2013-11-04 42 views
0

假設我有一個遊戲中的場景列表以及玩家列表。每個玩家從遊戲的場景列表中播放一些場景。我不想在Player中擁有Scenario的副本,我想擁有類似於指向Game對象列表的指針,這樣如果編輯了任何場景,它也會在Player列表中進行編輯。如何用java中的常用元素創建多個列表

Game 
Scenarios : list 

Player 
Scenarios : list -> each scenario here is a reference to scenario in Game 

現在在支持指針的語言中會很簡單,但Java被認爲是按值傳遞的。同時,我知道有在表內使用傳遞值的黑客等等。是否可以做到這一點?

回答

1

你有什麼試過?如果您試圖將參考文獻放入單獨的列表中,您將會知道它們是相同的參考文獻。術語「傳遞值」在這裏很棘手,因爲例如,您將在方法中獲取對同一對象的引用,但是java傳遞引用的副本。所以基本上java通過參考值

如果您在所有列表中放入相同的參考,原始的更改將反映在它們中。

SomeObject o = new SomeObject(); 

list0.add(o); 
list1.add(o); 
list2.add(o); 

o.setSomeValue(true); 

// all lists will "see" the changes 

list0.get(0).equals(o); // assuming list0 only contains o -> this is true 

作爲一個經驗法則:如果你不惹(互換,轉讓等)的引用指向你的對象的引用,只調用方法會被罰款。

+0

我目前正在計劃一個更大的(對我來說)項目,並想知道這是否可能,或者如果我應該嘗試以不同的方式實現它。此外,我會嘗試從list0中獲取someObject,而不是創建一個對象然後分享它,它會有所作爲嗎? – Xyzk

1

1路

我會使用的界面,你的情況。喜歡的東西:

public class Scenario implements ScenarioItf{/**/} 

而且Player只會ScenarioItf存儲。

第二方式

要存儲Scenarios列表分爲工廠類:

public class ScenariosFactory { 

    private static List<Scenarios> mScenarios = null; 


    public static void create(List<Scenarios> scenarios) { 
     mScenarios = scenarios; 
    } 


    public static List<Scenarios> getFactory(){ 
     if (mScenarios == null) 
      throw new NullPointerException("...null..."); 
     return mScenarios; 
    } 
} 

所以這兩個類PlayerGame可以使用相同的源。

0

Java是通過引用傳遞的,因此如果您在Player對象的列表AND中有一個Scenario對象,它們都將是一個指向內存中實際的Scenario對象的指針。

編輯:顯然,它是一種通過參考,但技術上不是真的。只要你不在任何一端去scenario = new Scenario(),它將是同一個對象。

+0

http:// stackoverflow。com/questions/40480/is-java-pass-by-reference似乎不同意 – Xyzk

+0

它是通過值,但值是一個引用(所以它是傳遞值的參考)。但在這種情況下,效果就是你所描述的。 – Axel

+0

這是錯誤的。在我的答案中查看我的解釋。 –

1

在你的情況下,如果Player對象有一個Scenario對象,而不是整個場景將被複制(或克隆),只有Scenario的引用將被複制。您可以通過播放器或列表的引用來修改方案;因爲它是一個對象很多的參考。

相關問題