0

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

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 的默认构造函数。如果调用 Samples 参数化构造函数,则调用 ClassOne、ClassTwo 和 ClassThree 的参数化构造函数。

我在上面写了代码。有什么优雅的方法可以做到这一点吗?

4

2 回答 2

1

您可以更改 Sample 构造函数以接受 Integer 对象参数。然后 Sample 的默认构造函数可以调用传递 null 的 Integer 构造。您可以更进一步,将 ClassOne、ClassTwo 和 ClassThree 的构造函数更改为也接受 Integer 对象参数并优雅地处理 null 情况:

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();
    }
  }
  ...
}
于 2013-05-30T12:30:13.657 回答
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);
    }
}

您的具体示例在其原始公式中可能更清晰,但这是将复杂构造逻辑移出构造函数的好方法。

于 2013-05-30T12:10:31.893 回答