0

对我来说问题的根源是 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 添加引用的内容,但是您必须使用库才能使用引用的想法让我放弃了这个想法。

4

2 回答 2

3

为什么它会在副本上运行?Java 传递对对象的引用。引用与 C++ 指针非常相似。

于 2012-06-29T15:10:23.387 回答
2

嗯...传递的引用不是整个对象的副本。原始对象将被修改,实际上没有数据移动。

于 2012-06-29T15:11:27.200 回答