Корень проблемы для меня в том, что 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 с библиотекой, но идея, что вы должны использовать библиотеку для использования ссылки, отталкивает меня от этой идеи.
Спасибо, у меня возникла идея, что Java только передается по значению, хотя это не имеет смысла, когда аргумент является большим, сложным классом. – zsalwasser
Это только пропуск по значению. Но он передает ссылки, а не объекты. –