![](/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.