![](/img/trans.png)
[英]How can I call parameterized constructor of default type from a parameterized constructor of type public which is in another class?
[英]Invoking parameterized/default constructor of a class?
我有一個有兩個構造函數的類。
Class Sample{
private ClassOne classOne;
private ClassTwo classTwo;
private ClassThree classThree;
public Sample(){
classOne = new ClassOne();
classTwo = new ClassTwo();
classThree = new ClassThree();
}
public Sample(int id){
classOne = new ClassOne(id);
classTwo = new ClassTwo(id);
classThree = new ClassThree(id);
}
//some code here
}
有一個帶有兩個構造函數的Sample。 需要在Sample類中實例化另外三個類(ClassOne,ClassTwo和ClassThree)。 所有三個類都包含默認和參數化構造函數。 如果調用了Sample類的默認構造函數,則應調用ClassOne,ClassTwo和ClassThree的默認cosntructor。 如果調用了Samples參數化構造函數,則調用ClassOne,ClassTwo和ClassThree的參數化構造函數。
我在上面寫了代碼。 有沒有優雅的方法呢?
假設您在Sample
類中沒有其他id
用途,您可以使用工廠方法模式:
class Sample {
private ClassOne classOne;
private ClassTwo classTwo;
private ClassThree classThree;
Sample(ClassOne classOne, ClassTwo classTwo, ClassThree classThree) {
this.classOne = classOne;
this.classTwo = classTwo;
this.classThree = classThree;
}
public static Sample factory(int id) {
ClassOne classOne = null;
ClassTwo classTwo = null;
ClassThree classThree = null;
if ( id == -1 ) {
classOne = new ClassOne();
classTwo = new ClassTwo();
classThree = new ClassThree();
}
else {
classOne = new ClassOne(id);
classTwo = new ClassTwo(id);
classThree = new ClassThree(id);
}
return new Sample(classOne, classTwo, classThree);
}
}
您的具體示例可能在其原始配方中更清晰,但這是將復雜構造邏輯移出構造函數的好方法。
您可以更改Sample構造函數以接受Integer對象參數。 然后,Sample的默認構造函數可以調用傳遞null的Integer構造。 您可以更進一步,更改ClassOne,ClassTwo和ClassThree的構造函數,以接受Integer對象參數並優雅地處理null case:
class Sample {
private ClassOne classOne;
private ClassTwo classTwo;
private ClassThree classThree;
public Sample(){
this(null);
}
public Sample(Integer id){
super();
classOne = new ClassOne(id);
classTwo = new ClassTwo(id);
classThree = new ClassThree(id);
}
...
}
class ClassOne {
private int id;
public ClassOne(Integer id) {
super();
if (id == null) {
this.id = 0; // or whatever default value
} else {
this.id = id.intValue();
}
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.