问题的根源在于Java不允许引用。
问题可以简洁地概括。想象一下,你有一个Blob对象列表:
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中的一个应该采用另一个的属性(在这种情况下,添加质量并合并giganticData集),另一个应该是标记为从列表中删除。
撇开如何最佳地识别相邻blob的问题,本身就是一个stackoverflow问题,你如何在Blob类中保留blobMerge()逻辑?在C或C ++中,这很简单,因为您可以将一个Blob指针传递给另一个,而“主机”可以对“guest”做任何喜欢的事情。
但是,上面在Java中实现的blobMerge()将在“guest”Blob的副本上运行,它有两个问题。 1)不需要承担复制giganticData的高额费用,2)“guest”Blob的原始副本将不会受到包含列表的影响。
我只能看到两种方法:
1)传递副本,做两次。换句话说,Blob A主机Blob B和Blob B主持Blob A.你最终得到了正确的答案,但已经做了比必要更多的工作。
2)将blobMerge()逻辑放在包含包含List的Class中。但是,当您开始对Blob(BlueBlob,RedBlob,GreenBlob等)进行子类化时,此方法的扩展性非常差,因此每个排列的合并逻辑都不同。您最终得到了包含列表的通用容器中的大多数特定于子类的代码。
我已经看到了一些关于使用库添加Java引用的方法,但是你必须使用库来使用引用的想法让我想到了这个想法。
答案 0 :(得分:3)
为什么它会在副本上运行? Java传递对象的引用。引用非常类似于C ++指针。
答案 1 :(得分:2)
嗯......传递的引用不是整个对象的副本。原始对象将被修改,实际上没有数据移动。