問題的根源在於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引用的一些信息,但是您必須使用庫來使用引用的想法才能讓我意識到這一點。
謝謝,不知何故,我得到了Java只是傳值的想法,儘管當一個參數是一個大的,複雜的類時,這沒有任何意義。 – zsalwasser
它只是通過價值。但它傳遞引用,而不是對象。 –