2014-09-25 2 views
2

Java에서 모든 변수는 값으로 전달됩니다. 객체의 경우 이것은 객체에 대한 참조를 전달한다는 것을 의미합니다. 다음 상황과 혼동 스럽습니다. 우리는 객체 그래프를 가지고 있다고 가정 해 봅시다. 하나의 객체는 다른 객체에 대한 필드 참조로 객체가 user.address.city와 같은 하나 이상의 객체에 대한 참조를 포함합니다. 여기서 우리는 클래스 User의 인스턴스 인 을 가지며, 인스턴스는 String - city 유형의 필드를 가진 클래스 Address의 인스턴스를 참조합니다. 이제 우리는이 사용자가 있다고 가정 해 봅시다 :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

당신은 기계공/언어를 완벽하게 이해합니다. 그러나 당신의 디자인이이 문제를 일으킬 것이므로 작동하지 않는다는 것이 옳습니다. 그래서 왜 내가 디자인 수정을 upvoted. – djechlin

답변

1

나는 당신의 생각이 꺼져 있다고 생각합니다.

메리가 이동하면 새 주소로 이동한다는 의미입니다. Java에 넣으십시오. Mary에 대한 다른 주소를 작성하기 만하면됩니다.

IMO와 동일한 개체 인 경우 동일한 개체를 할당하도록 복제하면 안됩니다. (일부 처리 계산의 경우).

커플 링을 줄이고 mary.setAddress (String streeName, String City, String State)를 사용하십시오. 일반적으로 주소의 도시는 거리가 한 도시에서 다른 도시로 이동할 수 없으므로 변경해서는 안되기 때문에 setCity() 공용 메소드가 없어야합니다.

7

문제는 Address 클래스의 잘못된 디자인을 나타냅니다.

Address 클래스는 지리적 위치를 나타내며 고정되어 있습니다. 개인이 이동하면 지리적 위치가 변경되지 않습니다. 대신, 개인이 거주하는 지리적 위치는 입니다.

주소에 대한 setter를 제거하고 변경 불가능한 개체로 만듭니다.

  1. 개인이 다른 개인과 기존 주소 (객체 인스턴스)를 공유하는 경우, 기존의 참조를 할당 : 다음 중 하나를 수행해야합니다 개인 이동, .
  2. 개인이 새 주소 (새 개체 인스턴스)로 이동하면 해당 주소를 새 Address 인스턴스에 할당합니다.
+0

정답입니다. – djechlin

+0

은 아마도 내 대답보다 +1이 좋을 것입니다. –

+1

@Ajk_P 당신의 대답은 맞지만 당신은 아직 불변성의 개념으로 일하지 않았을 것입니다. 이것이 틀림없는 방법입니다. 매우 동시적이고 기능적인 프로그래밍에서 매우 중요합니다. 주소의 도시 나 날짜와 같이 변경되지 않는 항목이 코드에서 변경되지 않으면 생활이 더 쉬워집니다. – djechlin