私のプロジェクトには多くのバリューオブジェクトがあります。Java BuilderTestPattern - 定型表現を避けるにはどうすればよいですか?
私の値オブジェクトは、次のいずれかのように見えるので、私は、いくつかの決まり文句を排除するために、プロジェクトのロンボクを使用していないよ:
@Value
@Accessors(fluent = true)
public class ValueObject {
private final String firstProp;
private final int secondProp;
}
悪くない、ほとんど定型を。
今、すべてのテストでarg-argsコンストラクタを使用しています。これはかなり厄介に見えるので、私は、私が代わりにBuilderパターンのバリエーションをご紹介しますと思った:
public class ValueObjectBuilder {
private static final int DEFAULT_VALUE_FOR_SECOND_PROP = 666;
private String firstProp = "default value for first prop;
private int secondProp = DEFAULT_VALUE_FOR_SECOND_PROP;
private ValueObjectBuilder() {}
public static ValueObjectBuilder newValueObject() {
return new ValueObjectBuilder();
}
public ValueObjectBuilder withFirstProp(String firstProp) {
this.firstProp = firstProp
return this;
}
public ValueObjectBuilder withFirstProp(int secondProp) {
this.secondProp = secondProp;
return this;
}
public ValueObject build() {
return new ValueObject(
firstProp, secondProp
);
}
}
とコードが今はかなり良さそうに見えます:
今ValueObjectBuilder
.newValueObject()
.withFirstProp("prop")
.withSecondProp(15)
.build();
、問題がある - 私が述べたように、私が持っています同じようなクラスをたくさん書く...私はすでにコピーペーストで疲れている。
私が探しているものは、何とかこのコードを生成する黒マジックスマートツールです。
ロンボクには@Builder
注釈がありますが、私の要件を満たしていません。理由は次のとおりです:
1)私はロンボクのビルダーでデフォルト値を提供できません。実は、実際には、ビルダークラスのテンプレートを自分自身のように実装することによって可能です。
@Builder
public class Foo {
private String prop;
public static class FooBuilder() {
private String prop = "def value";
...
}
}
これもいくつかの定型文を生成します。
2)私はロンボクのビルダーの各フィールドアクセサーにプレフィックスを付ける方法を見つけることができません。たぶん@ここで助けてくれますか?しかし、私はそれを適切に使う方法はわかりません。
3)最も重要な理由:私は「自然な」建築業者を作りません。私が理解する限り、ロンボクは与えられた注釈付きクラスのBuilderを作成するように設計されています - build()
メソッド内から他のオブジェクトを返す方法があるかどうかはわかりません。
したがって、合計: 私を助ける可能性のあるツールをご存知ですか?あるいは、私が言及したことは、実際にはロンボクを使って達成することが可能でしょうか? [OK]を
EDIT
ので、私はおそらく、この特定のケースへの解決策を見つけました。ロンボク島で、私たちは使用することができます。
@Setter
@Accessors(chain = true, fluent = true)
@NoArgsConstructor(staticName = "newValueObject")
public class ValueObjectBuilder {
private String firstProp = "default";
private int secondProp = 666;
public ValueObject build() {
return new ValueObject(firstProp, secondProp);
}
}
乾杯、 Slawek
ありがとうございます。まず、私はIDEAを使用しています。 – slnowak
私はIDEAが優れていると聞きました。以前はRubyMineを使用していたので、それはRubyの仕事にとっては素晴らしいことです!私はこれらの発電機がないことを知っています。かなりoロンボクとして滑らかに...(削除され、ロンボクの正しい綴りに置き換えられる) – unigeek