簡體   English   中英

調用類的參數化/默認構造函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM