5

私は現在、ウィキペディアの記事Builder pattern http://en.wikipedia.org/wiki/Builder_patternで提案されている Java 実装に厳密に従って、Builder パターンを使用しています。

これは、私の実装を説明するサンプル コードです。

public class MyPrimitiveObject {
  private String identifier="unknown";
  public static class Builder {
    private final MyPrimitiveObject obj = new MyPrimitiveObject();
    public MyPrimitiveObject build() { return obj; }
    public Builder setidentifier (String val) {
     obj.identifier = val;
     return this;
    }
  }
  public static Builder createBuilder() { return new Builder(); }
  @Override public String toString() { return "ID: "+identifier; }
}

このクラスを使用するアプリケーションのいくつかで、たまたま非常によく似た構築コードを見つけたので、サブクラス化MyPrimitiveObjectMySophisticatedObjectて、繰り返されるすべてのコードをそのコンストラクターに移動することを考えました..ここに問題があります。

スーパークラス Builder を呼び出して、返されたオブジェクトをインスタンスとして割り当てるにはどうすればよいですか?

public class MySophisticatedObject extends MyPrimitiveObject {
  private String description;
  public MySophisticatedObject (String someDescription) {
    // this should be the returned object from build() !!
    Builder().setidentifier(generateUUID()).build()
    description = someDescription;
  }     
}
4

2 に答える 2

6

MySophisticatedObject.Builderを拡張MyPrimitiveObject.Builderし、そのbuild()メソッドをオーバーライドするネストを検討することをお勧めします。値を設定するインスタンスを受け入れるために、ビルダーに保護されたコンストラクターを用意します。

public class MyPrimitiveObject {
  private String identifier="unknown";
  public static class Builder {
    private final MyPrimitiveObject obj;
    public MyPrimitiveObject build() { return obj; }
    public Builder setidentifier (String val) {
     obj.identifier = val;
     return this;
    }

    public Builder() {
        this(new MyPrimitiveObject());
    }

    public Builder(MyPrimitiveObject obj) {
        this.obj = obj;
    }
  }
  ...
}

public class MySophisticatedObject extends MyPrimitiveObject {
  private String description;

  public static class Builder extends MyPrimitiveObject.Builder {
    private final MySophisticatedObject obj;
    public Builder() {
      this(new MySophisticatedObject());
      super.setIdentifier(generateUUID());
    }     
    public Builder(MySophisticatedObject obj) {
      super(obj);
      this.obj = obj;
    }

    public MySophisticatedObject build() {
      return obj;
    }

    // Add code to set the description etc.
  }
}
于 2012-04-10T16:18:50.237 に答える
1

必要なもの:

public class MySophisticatedObject extends MyPrimitiveObject {
  private String description;

  public static class SofisitcatedBuilder extends Builder {
    private final MySophisticatedObject obj = new MySophisticatedObject();
    public MyPrimitiveObject build() { return obj; }
    public Builder setDescription(String val) {
     obj.description = val;
     return this;
    }
  }

  public MySophisticatedObject (String someDescription) {
    // this should be the returned object from build() !!
    return new SofisitcatedBuilderBuilder()
         .setDescription(someDescription)
         .setidentifier(generateUUID()).build()
  }     
}
于 2012-04-10T16:21:19.160 に答える