2016-10-28 12 views
9

Lombok @Builder注釈を使用していますが、Stringフィールドの一部をオプションにしたい場合は、デフォルトで""にしてください。これを行う簡単な方法はありますか?私は何も見つけることができません。Lombokで@Builderまたは@Getterアノテーションを使用するデフォルトのフィールド値

nullの場合は、@Getterをデフォルト値に戻すようにカスタマイズすることもできます。

答えて

5

v1.16.16からは、@Builder.Defaultが追加されました。

@Builder.Defaultあなたのフィールド @Builderを使用するためのデフォルト値を設定できます。

例:

@Setter 
@Getter 
@Builder 
public class MyData { 
    private Long id; 
    private String name; 

    @Builder.Default 
    private Status status = Status.NEW; 
} 

がPS:彼らはまた、あなたが@Builder.Defaultを使用しなかった場合に警告を追加いいこと。

警告:(35,22)java:@Builderは、 式の初期化を完全に無視します。初期化式をデフォルトで とする場合は、@ Builder.Defaultを追加します。構築中に を設定できない場合は、フィールドをfinalにしてください。

+0

それは全くいいことではありません! '@ Default.Builder' **と**' NoArgsConstructor'を使うと(私は理解できませんが**時にはいくつかのフレームワークのため** ** argsコンストラクタを提供してはいけません)、初期化子**デフォルトのコンストラクタで**使用されていません!これは深刻なバグです。 –

+0

はい、私はあなたに同意します。ロンボクで生成されたコードの設計はあまりいいものではありません(生成されたクラスをチェックするのは良い考えです)。 1つの回避策は、引数なしコンストラクタを自分で書くことです。 – JafarKhQ

3

あなたは以下のようなビルダークラスを提供する必要があります。

@Builder 
public class XYZ { 
    private String x; 
    private String y; 
    private String z; 

    private static class XYZBuilder { 
     private String x = "X"; 
     private String y = "Y"; 
     private String z = "Z"; 
    } 
} 

その後xyzのデフォルト値は"X""Y""Z"になります。どこへ行く

2

もう一つの方法は、@Builder(toBuilder = true)

@Builder(toBuilder = true) 
public class XYZ { 
    private String x = "X"; 
    private String y = "Y"; 
    private String z = "Z"; 
} 

を使用することであり、次のように、あなたはそれを使用する:

new XYZ().toBuilder().build(); 

accepted answerに関しては、このアプローチは、クラスの名前を変更するにはあまり賢明です。 XYZの名前を変更しても、内部静的クラスXYZBuilderの名前を忘れた場合、魔法は消えてしまいます!

もっと好きな方法を使用するのはあなた次第です。

+1

あなたは 'new XYZ()'の中の '()'を忘れてしまいました。 –

+0

@HazelTroost fixed – JeanValjean

関連する問題