2015-01-09 6 views
8

私のプロジェクトには多くのバリューオブジェクトがあります。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

答えて

1

は日食のためBob-the-builderをお試しください。うーん..私はあなたが日食を使用している場合は最高の作品だと思う! Eclipseを使用していない場合は、ここにリンクされているページ下部に関連するいくつかのプロジェクトがあります。

+0

ありがとうございます。まず、私はIDEAを使用しています。 – slnowak

+0

私はIDEAが優れていると聞きました。以前はRubyMineを使用していたので、それはRubyの仕事にとっては素晴らしいことです!私はこれらの発電機がないことを知っています。かなりoロンボクとして滑らかに...(削除され、ロンボクの正しい綴りに置き換えられる) – unigeek

5

私はこれが古いと知っていますが、誰かがこの問題にぶつかると、ビルダーのデフォルト値を提供するための代替ソリューションが見つかりました。

ビルダーメソッドをオーバーライドし、ビルダーを返す前にデフォルト値を指定します。したがって、上記の場合には:

@Builder 
public class Foo { 
    private String prop; 

    public static FooBuilder builder() { 
     return new FooBuilder().prop("def value"); 
    } 
} 

多くの変数がある場合は痛みを伴う私見である(それは理想的なソリューションではないのですが、ビートが全体ビルダー自体を無効にするか、カスタムのコンストラクタを持つようになるそれはまだいいだろう。 @Withまたは@Defaultアノテーションの行に沿って何かを持ってこれを処理してください。

+0

ありがとう、私は後でそれをチェックする! – slnowak

+1

@mikeaどのバージョンを使用していますか? 'FooBuilderは公開されておらず、パッケージ外からアクセスできません。 ' – nKognito

+0

@nKognito 1.16.4 – mikea

関連する問題