2012-07-06 24 views

Trả lời

12

Mục đích là chụp giá trị tạm thời trong khi xây dựng.

Một ví dụ được đưa ra trong Solution 53 của Java Puzzlers:

public class MyThing extends Thing { 
    private final int arg; 

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

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

Trong trường hợp này, chúng tôi muốn nắm bắt và lưu trữ các thông số mà chúng ta muốn vượt qua các nhà xây dựng lớp cha. Để làm như vậy, chúng ta tạo ra một hàm tạo riêng của helper, mà constructor công khai của chúng ta sau đó gọi.

+0

đây có phải là ý tưởng hay để nắm bắt trạng thái của đối tượng khi hàm khởi tạo chạy và chưa hoàn thành việc thực hiện? Tôi có nghĩa là đối tượng có thể ở trạng thái không nhất quán? – Inquisitive

+0

Downvoter: bất kỳ bình luận nào? –

+0

@Subhra: Tôi không chắc bạn đang hỏi gì. Đối tượng nào có thể ở trạng thái không nhất quán? –

1

Giải thích được đưa ra với một ví dụ trong Java Concurrency In Practice chương 4 phần 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; 
    } 
} 

Trình tạo riêng tư tồn tại để tránh điều kiện chạy sẽ xảy ra nếu trình tạo bản sao được triển khai như thế này (tr.x, p.y).

có nghĩa là gì là, nếu bạn không có một constructor tư nhân và bạn thực hiện copy constructor theo cách sau:

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

Bây giờ giả sử rằng thread A có quyền truy cập vào SafePoint p đang thực hiện trên bản sao của nhà xây dựng này (px, py) hướng dẫn và tại thời điểm không may mắn khác thread B cũng có quyền truy cập vào SafePoint p thực thi setter set (int x, int y) trên đối tượng p. Kể từ khi nhà xây dựng bản sao của bạn đang truy cập xy instance variable p 's trực tiếp mà không thích hợp khóa nó có thể nhìn thấy trạng thái không phù hợp của đối tượng p.

Trong trường hợp như xây dựng tư nhân đang truy cập biến p 's xy qua getter được đồng bộ, do đó bạn được đảm bảo để xem trạng thái nhất quán của đối tượng p.