毫無疑問,這已被問及在這裏回答了十幾次,但我無法找到滿意的答案。只允許父廠方法實例化子類
我有一個類的家庭,我只想通過像這樣的靜態方法(我可能在這裏輸入錯別字,而不嘗試編譯)輸入的抽象父類實例化。
public abstract class Papa {
public static Papa newInstance() {
String strClass = Papa.figureOutTheNameOfChildClassToInstantiate();
Papa papa = (Papa) Class.forName(strClass).newInstance();
return papa;
}
public abstract void doSomething();
...
}
public class Child extends Papa {
public void doSomething() { /* Do something */ }
}
這或多或少是我現在擁有的。我希望做的是確保Child只能通過工廠方法Papa.newInstance()實例化。我試圖通過將Child的無參數構造函數設爲私有,但Papa無法實例化它。
所以,我的問題是,我如何確保子實例只能通過工廠方法Papa.newInstance()創建?
在內部類使用私有的構造是不是一個好主意 - 這迫使Java編譯器生成存根構造帶更多的知名度所以外部類可以實例化它們... – thkala
實際上,如果不是因爲直到現在我已經直接在我的項目中實例化Child(和它的兄弟姐妹),現在我不會打擾它想要識別並刪除所有這些直接實例,並強迫自己始終使用未來的工廠方法。但即使如此,我仍然可以沒有所有的大驚小怪... –
對於這樣的事情,類似Checkstyle的東西可能是謹慎的選擇。有一天,我們將擁有一種語言,它具有足夠強大的類型/訪問系統來執行您想要做的事情,但在Java中這樣做似乎可能會導致Lovecraftian。 –