2012-06-29 4 views
0

Корень проблемы для меня в том, что Java не разрешает ссылки.Как два элемента списка 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; 
     } 
    } 
} 

Если две капель достаточно близко, они должны быть объединены, а это означает одно из двух сгустков сравниваемых должны взять на себя атрибуты других (в данном случае, при добавлении масса и объединение наборов giganticData), а другая должна быть отмечена для удаления из списка.

Отметив проблему оптимальной идентификации смежных блоков, вопрос о сворачивании потока в отдельности, как вы сохраняете логику blobMerge() в классе Blob? В C или C++ это было бы просто, поскольку вы могли просто передать один Blob указатель на другой, а «host» мог делать все, что ему нравится «гостя».

Однако blobMerge(), реализованный выше в Java, будет работать с копией «гостя» Blob, которая имеет две проблемы. 1) Не нужно брать на себя большую стоимость копирования giganticData, и 2) оригинальная копия «гостя» Blob останется неизменной в содержащем списке.

Я вижу только два способа сделать это:

1) Пропускает копий, делая все в два раза. Другими словами, Blob A содержит Blob B и Blob B, которые размещают Blob A. В итоге вы получите правильный ответ, но сделали больше работы, чем необходимо.

2) Поместите логику blobMerge() в класс, содержащий содержащий список. Однако этот подход очень мало масштабируется при запуске подкласса Blob (BlueBlob, RedBlob, GreenBlob и т. Д.), Так что логика слияния отличается для каждой перестановки. В итоге вы получаете большую часть кода подкласса в общем контейнере, который содержит этот список.

Я видел кое-что о добавлении ссылки на Java с библиотекой, но идея, что вы должны использовать библиотеку для использования ссылки, отталкивает меня от этой идеи.

ответ

3

Зачем это работает на копии? Java передает ссылки на объекты. И ссылки очень похожи на указатели C++.

+0

Спасибо, у меня возникла идея, что Java только передается по значению, хотя это не имеет смысла, когда аргумент является большим, сложным классом. – zsalwasser

+0

Это только пропуск по значению. Но он передает ссылки, а не объекты. –

2

Um ... ссылка передается не копией всего объекта. Исходный объект будет изменен, и данные фактически не будут перемещены.

Смежные вопросы