2012-06-29 22 views
0

问题的根源在于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引用的一些信息,但是您必须使用库来使用引用的想法才能让我意识到这一点。

回答

3

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

+0

谢谢,不知何故,我得到了Java只是传值的想法,尽管当一个参数是一个大的,复杂的类时,这没有任何意义。 – zsalwasser

+0

它只是通过价值。但它传递引用,而不是对象。 –

2

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