2014-09-25 2 views
2

В Java все переменные передаются по значению. Для объектов, это означает, что мы передаем ссылку на объект. Я смущен со следующей ситуацией. Предположим, что у нас есть график объектов. Один объект содержит ссылку на другой объект, , этот объект имеет ссылку на еще один объект, например: user.address.city. Здесь у нас есть экземпляр класса User, , который имеет ссылку на экземпляр класса Address, у которого есть поле типа String - city. Теперь, скажем, у нас есть 2 пользователей:Объекты и ссылки в Java

User bob = new User(); 
User mary = new User(); 

Подозрение на объект «боб» имеет ссылку на адрес объекта:

Address bobAddress = new Address(); 
bobAddress.setCity("New York"); 

bob.setAddress(bobAddress); 

Скажем Мэри и Боб начали жить вместе в одном доме, и у них есть такой же адрес, не проблема:

mary.setAddress(bobAddress); 

Теперь мэри и боб не имеют ссылки на один адрес объекта. Но один день они развелись и мэри теперь имеет другой адрес:

mary.getAddress().setCity("Boston"); 

И здесь у нас есть проблема: Мэри изменила что-то в ее адрес, , но она также изменила адрес Боба, , потому что они одни и те же ссылки ,

Весь текст выше был моей попыткой описать в небольшом масштабе большую проблему для меня: Когда я должен создать копию (клон) какого-либо объекта, прежде чем установить ссылку на этот объект в другой экземпляр? Существуют ли какие-либо правила или методы? Я знаю об неизменяемых объектах (например, String, Integer ...) с этими объектами, нам вообще не нужно думать о таких проблемах, но что, если у меня есть изменяемые объекты. Как я должен себя вести с ними?

+0

Вы прекрасно понимаете механику/язык. Но вы правы, что ваш * дизайн * создаст эту проблему и, следовательно, не сработает. Поэтому почему я исправил коррекцию дизайна. – djechlin

ответ

1

Я думаю, что ваше мышление выключено.

Если Мэри движется, это означает, что она перейдет на новый адрес. Попробуйте поместить это на Java. Вам просто нужно создать другой адрес для Мэри.

IMO, вы никогда не должны клонировать один и тот же объект для назначений, если это тот же объект. (для некоторых вычислений обработки).

Просто уменьшите связь и введите mary.setAddress (String streeName, String City, String State). Обычно город адреса НЕ ДОЛЖЕН изменяться по мере того, как улицы не могут перемещаться из одного города в другой, поэтому вы даже не должны иметь открытый метод setCity().

7

Ваша проблема указывает на плохой дизайн класса Address.

Класс Address представляет собой географическое местоположение и является фиксированным. Когда человек перемещается, географическое положение не изменяется; вместо этого, Географическое положение, в котором изменяется отдельный человек.

Удалите сеттеры для адреса и сделайте его неизменным объектом. Когда человек двигается, вы должны сделать одно из следующих действий:

  1. Если человек делится на существующий адрес (экземпляр объекта) с другим человеком, а затем присвоить существующую ссылку.
  2. Если человек переезжает на новый адрес (новый экземпляр объекта), затем назначает адрес новому экземпляру адреса.
+0

Это правильный ответ. – djechlin

+0

, вероятно, лучше сформулировано, чем мой ответ +1 –

+1

@Ajk_P ваш ответ прав, но вы, возможно, еще не работали с концепцией неизменности. Это определенно способ сформировать это. Это чрезвычайно важно при высококонкурентном и функциональном программировании. Жизнь становится легче, когда вещи, которые не меняются (например, город адреса или дата года), также не меняются в коде. – djechlin

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