问题的根源在于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
它只是通过价值。但它传递引用,而不是对象。 –