3

私はいくつかのことにビルダーパターン(Joshua Blochで説明されているようにEffective Java)を使用していますが、特に厄介な繰り返しが含まれています:

public class Foo {
    private String name;
    private int age;

    public static class Builder implements IBuilder {
        private String name;
        private int age;

        Builder name(String value) {
            name = value;
            return this;
        }

        Builder age(int value) {
            age = value;
            return this;
        }

        Foo build() {
           return new Foo(this);
        }
    }

    private Foo(Builder builder) {
        name = builder.name;
        age = builder.age;
    }
}

小さいですが、面倒です。各クラスで変数を宣言する必要があります。フィールドを使用してクラスを作成し、そのクラスを拡張しようとしましたが、エラーが発生しました:{variable_name} has private access in {class_name}

変数を公開せずにこれを行う方法はありますか?

4

1 に答える 1

0

ビルダーが純粋に一連の状態をキャプチャするためのものである場合(中間計算を行わない場合)、ビルダーインターフェイスを定義し、Javaプロキシジェネレーターを作成するだけで繰り返しを解決できます。

これを行う場合、ビルダー(内部)クラスのプライベートフィールドにアクセスできる外部クラスに依存することはできません。これを回避するには、各フィールドのアクセサーも定義する必要があります。したがって、たとえば:

public class Foo {
  public interface Builder extends IBuilder {
    Builder name(String name);
    String name();

    Builder age(int age);
    int age();
    ...
  }

  public static Builder builder() {
    return BuilderFramework.newInstance(Builder.class);
  }

  public Foo(Builder builder) {
    ...
  }
}

または、ビルダーがすべてのフィールドをまたはMap同様の構造で公開することもできます。そのルートを使用すると、インターフェースに必要なのはチェーニングセッターだけです。ただし、コンストラクター内のすべてのフィールド使用量のコンパイル時チェックをあきらめます。私見、妥協が大きすぎます。

于 2012-05-24T19:47:13.697 に答える