调用类的参数化/默认构造函数?

时间:2013-05-30 09:52:16

标签: java

我有一个有两个构造函数的类。

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的参数化构造函数。

我在上面写了代码。有什么优雅的方法吗?

2 个答案:

答案 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();
    }
  }
  ...
}