2012-07-06 3 views

답변

12

건설 중 임시 값을 캡처하는 것이 목표입니다.

Java Puzzlers의 솔루션 (53)에 나와있다 :이 경우

public class MyThing extends Thing { 
    private final int arg; 

    public MyThing() { 
     this(SomeOtherClass.func()); 
    } 

    private MyThing(int i) { 
     super(i); 
     arg = i; 
    } 
} 

, 우리는 캡처하고 우리는 슈퍼 클래스 생성자에 전달하고자하는 매개 변수를 저장할. 그렇게하기 위해서 우리는 private helper 생성자를 생성합니다. 생성자는 public 생성자가 호출합니다.

+0

생성자가 실행되고 아직 실행이 완료되지 않은 상태에서 객체의 상태를 캡처하는 것이 좋습니다. 객체가 일관성없는 상태 일 수 있습니다. – Inquisitive

+0

Downvoter : 의견이 있으십니까? –

+0

@Subhra : 당신이 무엇을 요구하는지 모르겠습니다. 어떤 개체가 일관성없는 상태 일 수 있습니까? –

1

설명은 예 : Java Concurrency In Practice 4 장 4.3.5 절에 설명되어 있습니다.

public class SafePoint { 
    private int x, y; 

    private SafePoint(int[] a) { 
     this(a[0], a[1]); 
    } 

    public SafePoint(SafePoint p) { 
     this(p.get()); 
    } 

    public SafePoint(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public synchronized int[] get() { 
     return new int[] { x, y }; 
    } 

    public synchronized void set(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

개인 생성자는 복사 생성자이 (p.x, p.y)로 구현 된 경우 발생할 수있는 경쟁 조건을 방지하기 위해 존재한다.

public SafePoint(SafePoint p) { 
    this(p.x, p.y); 
} 

지금 스레드 A가 SafePoint 페이지에 대한 액세스를 가지고있다 가정 실행 : 당신이 개인 생성자가 없었어요 당신은 다음과 같은 방법으로 복사 생성자를 구현하는 경우

은 무슨 뜻이며, 복사 생성자의 this (px, py) 명령과 위의 불행한 타이밍에서 SafePoint에 대한 액세스 권한이있는 다른 스레드 B도 pp 개체의 setter set (int x, int y)을 실행합니다. 복사본 생성자 잠금 적절한 않고 직접 PX 및 Y 인스턴스 변수를 액세스하기 때문에 그것은 객체 P의 불일치 상태를 볼 수 있었다.

여기서 개인 생성자 P의 변수가 액세스 될 때 X 및 Y 그래서 당신은 동기화 객체 P의 일관된 상태를 표시 보장 게터 통해.