[英]What is a Java example of the “private constructor capture” idiom?
有人可以用一個例子向我解釋私有構造函數捕獲習慣用法並指出我們實際需要/不需要這種設計的地方嗎?
目的是在施工期間捕獲臨時值。
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;
}
}
在這種情況下,我們希望捕獲並存儲我們希望傳遞給超類構造函數的參數。 為了做到這一點,我們創建了一個私有幫助器構造函數,然后我們的公共構造函數調用它。
在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;
}
}
存在私有構造函數以避免在將復制構造函數實現為此(px,py)時將發生的競爭條件。
這意味着,如果您沒有私有構造函數,並且您以下列方式實現了復制構造函數:
public SafePoint(SafePoint p) {
this(p.x, p.y);
}
現在假設線程A是具有上述復制構造的本(PX,PY)的指令,並在不走運的定時也能夠訪問還原點p另一個線程B正在執行訪問還原點p上執行對象設定器組(INT的x,int y)對p 。 由於您的復制構造函數直接訪問p的x和y實例變量而沒有正確的鎖定,因此可能會看到對象p的不一致狀態。
私有構造函數通過同步的getter訪問p的變量x和y ,這樣你就可以保證看到對象p的一致狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.