2016-09-23 6 views
3

나는 mutable/immutable 클래스에 대해 읽고 java의 생성자를 복사하고 this example을 우연히 발견했다. 그는 다음과 같이 게터 사용하는 복사 생성자 내부클래스의 필드에 액세스하는 복사 생성자?

: 내 질문은

/** 
    * Copy constructor. 
    */ 
    public Galaxy(Galaxy aGalaxy) { 
    this(aGalaxy.getMass(), aGalaxy.getName()); 
    //no defensive copies are created here, since 
    //there are no mutable object fields (String is immutable) 
    } 

는 것보다 다른 이유

가 그것의 좋은 코딩 연습, 누군가가 복사 생성자가 아닌 내부에 게터를 사용하기 위해 같은 필드에 액세스하는 것 : (aGalaxy.aMass, aGalaxy.aName). 그렇게하는 예제를 찾을 수는 있지만 순전히 코딩 스타일인지 또는 복사 생성자 내에서 getters를 사용할 때의 잠재적 이점이 있습니까?

+0

A '저하 복사' 계산 결과 *를 저장하십시오. 다른 사람들이 수업에서 할 수있는 것을 제어 할 수 없으므로 신뢰할 수없는 전술 (좋은 CPU 시간으로 지불 할 수 있음)이 –

+1

aGalaxy.aMass를 사용하는 것이 더 나은 방법인가요? getters를 사용하는 것과 같다고 생각하면 불일치가 발생할 수 있습니다. – KillBill

+0

반대로 getters를 사용하면 더 안전합니다. –

답변

1

대부분의 경우 무의미하지만 하위 클래스가 호출하는 getter를 덮어 쓰도록 선택하면이 연습으로 인해 잡기 힘든 버그가 발생할 수 있습니다. 여기

은 간단한 예입니다 :

class Base { 
    private final String name; 
    public String getName() {return name;} 
    public Base(String name) { 
     this.name = name; 
    } 
    public Base(Base b) { 
     this(b.getName()); 
    } 
} 
class Derived extends Base { 
    public String getName() { 
     return "["+super.getName()+"]"; 
    } 
    public Derived(String name) { 
     super(name); 
    } 
    public Derived(Derived d) { 
     this(d.getName()); 
    } 
} 

참고 방법 Derived 무시 getName()Derived의 복사 생성자가 문제로 이어지는, 이름의 수정 된 버전에 액세스 :

Derived orig = new Derived("hello"); 
Derived copy = new Derived(orig); 
System.out.println(orig.getName()); // Prints [hello] 
System.out.println(copy.getName()); // Prints [[hello]] 

마지막 인쇄물에 대괄호가 두 배로 표시되어 사본이 실제로 사본이 아닙니다.

protected 변수를 사용하거나 게터를 final으로 만들면이 문제를 방지하는 데 도움이됩니다.

이 문제의 근본 원인은 하위 속성이 저장된 속성에 대한 getter를 재정의하므로 getters를 만드는 방법을 선호한다고 생각합니다. final. 예를 들어 동적으로하는`Galaxy.name`를 사용하지 않는 등 * 질량 하늘 영역 검색의 시간에서 그것의 이름을 계산하고, 파생 갤럭시 클래스의

Demo.