对我来说问题的根源是 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 中的一个应该具有另一个的属性(在这种情况下,添加质量并合并巨大的数据集),另一个应该被标记为删除从列表中。
抛开如何以最佳方式识别相邻 blob 的问题(本身就是一个 stackoverflow 问题)不谈,如何在 Blob 类中保留 blobMerge() 逻辑?在 C 或 C++ 中,这很简单,因为您只需将一个 Blob 指针传递给另一个 Blob,“主机”就可以对“客人”做任何它喜欢的事情。
但是,上面在 Java 中实现的 blobMerge() 将对“来宾”Blob 的副本进行操作,这有两个问题。1) 无需承担复制 giganticData 的高昂成本,并且 2) “guest” Blob 的原始副本在包含列表中将不受影响。
我只能看到两种方法:
1) 把副本传进去,每件事都做两次。换句话说,Blob A 托管 Blob B,而 Blob B 托管 Blob A。您最终得到了正确的答案,但所做的工作超出了必要的范围。
2) 将 blobMerge() 逻辑放在包含 List 的 Class 中。但是,当您开始对 Blob(BlueBlob、RedBlob、GreenBlob 等)进行子类化时,这种方法的扩展性很差,因此每个排列的合并逻辑都不同。您最终会在包含列表的通用容器中获得大多数特定于子类的代码。
我已经看到了一些关于使用库向 Java 添加引用的内容,但是您必须使用库才能使用引用的想法让我放弃了这个想法。