我有一个有两个构造函数的类。
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的参数化构造函数。
我在上面写了代码。有什么优雅的方法吗?
答案 0 :(得分:1)
假设您id
课程内的Sample
没有其他用途,您可以使用工厂方法模式:
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);
}
}
您的具体示例在其原始配方中可能更干净,但这是将复杂构造逻辑移出构造函数的好方法。
答案 1 :(得分:1)
您可以更改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();
}
}
...
}