Каждая ссылка в Java - это просто адрес какого-то объекта в памяти, поэтому требуемые «автоматические обновления» невозможны без дополнительного кода.
Представьте, что region1
ссылается на адрес 0x1001
в памяти, а region2
ссылается на 0x2001
. Эти две области памяти содержат фактические данные региона:
0x1001
: x = 0, y = 5, width = 20, height = 30
0x2001
: x = 100, y = 200, width = 50, height = 20
Если бы вы могли как-то сказать, что объект в 0x2001
равен 0x1001
, используя ваш mergeRegions
метод, попытается ли Java сделать что-то подобное?
0x1001
: x = 0, y = 5, width = 20, height = 30
0x2001
: 0x1001
Это не сработает, потому что оба объекта Java должны быть Region
объектами, каждый с одинаковыми полями и методами. Если мы уничтожим объект Java на 0x2001
и просто введем простой адрес, ни одна из существующих ссылок на 0x2001
не будет работать, потому что все они ожидают объект Region
по этому адресу. Вот почему вы не можете "напрямую назначить" одну ссылку Java другой.
Вот три подсказки, которые помогут вам изменить ваш алгоритм:
- Вместо копирования адреса
0x1001
в 0x2001
, вы можете скопировать все данные из 0x1001
в объект в 0x2001
. Это сделает оба объекта эквивалентными, но разделенными.
- Вы можете ввести один уровень косвенности. Если вы знаете C, подумайте «указатели на указатели». Ваш массив
regions
будет содержать ссылки на IndirectRegion
объекты, которые, в свою очередь, будут содержать ссылки на реальные Region
объекты. Если вы хотите обновить region2
до region1
, вам нужно только попросить один из IndirectRegion
объектов обновить его внутреннюю ссылку.
- Дождитесь окончания вашего алгоритма, прежде чем объединять регионы. Если вам удастся собрать все операции слияния, вы сможете выполнить их все в одном цикле O (n).