2012-06-29 48 views
0

問題的根源在於Java不允許引用。兩個Java列表元素如何訪問對方?

該問題可以簡潔地總結。想象一下,你有斑點的對象的列表:

class Blob { 
    public int xpos; 
    public int ypos; 
    public int mass; 
    public boolean dead; 
    private List<Object> giganticData; 
    public void blobMerge(Blob aBlob) { 
     . . . 
     if (. . .) { 
      this.dead = true; 
     } else { 
      aBlob.dead = true; 
     } 
    } 
} 

如果兩個Blob靠得足夠近,他們應該合併,這意味着這兩個斑點被比較應該採取其他的屬性(在這種情況下的一個補充大規模並且合併巨大的數據集),另一個應該被標記爲從列表中刪除。

拋開如何最優地識別相鄰blob的問題,本身就是一個stackoverflow問題,如何在blob類中保留blobMerge()邏輯?在C或C++中,這很簡單,因爲您可以將一個Blob指向另一個指針,「主機」可以對「guest」執行任何操作。

但是,在Java中實現的blobMerge()將在「guest」Blob的副本上運行,這有兩個問題。 1)沒有必要承擔複製巨大數據的鉅額費用,並且2)「訪客」Blob的原始副本在包含列表中將保持不受影響。

我只能看到兩種方法可以做到這一點:

1)傳遞的副本,做兩遍。換句話說,Blob A託管Blob B和Blob B託管Blob A.您最終得到正確的答案,但已經完成了比必要的更多工作。

2)將blobMerge()邏輯置於包含List的Class中。但是,當您開始對Blob(BlueBlob,RedBlob,GreenBlob等)進行子類化時,此方法的擴展性很差,因此每個排列的合併邏輯都不相同。您最終得到了保存列表的通用容器中的大部分子類特定代碼。

我已經看到有關使用庫添加Java引用的一些信息,但是您必須使用庫來使用引用的想法才能讓我意識到這一點。

回答

3

它爲什麼會在副本上運行? Java傳遞對象的引用。引用非常類似於C++指針。

+0

謝謝,不知何故,我得到了Java只是傳值的想法,儘管當一個參數是一個大的,複雜的類時,這沒有任何意義。 – zsalwasser

+0

它只是通過價值。但它傳遞引用,而不是對象。 –

2

嗯...引用傳遞不是整個對象的副本。原始對象將被修改,並且實際上沒有數據移動。