1. ホーム
  2. java

lombokのデフォルト値。コンストラクタとビルダーの両方でデフォルトを開始する方法

2023-08-30 02:41:13

質問

あるオブジェクト

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {
    private int id;
    private String nick;
    private boolean isEmailConfirmed = true;
}

そして、2つの方法で初期化します。

UserInfo ui = new UserInfo();
UserInfo ui2 = UserInfo.builder().build();

System.out.println("ui: " + ui.isEmailConfirmed());
System.out.println("ui2: " + ui2.isEmailConfirmed());

以下は出力です。

ui: true
ui2: false

builderはデフォルト値を取得しないようです。私は @Builder.Default アノテーションを追加すると、オブジェクトは次のようになります。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo { 
    private int id;
    private String nick;
    @Builder.Default
    private boolean isEmailConfirmed = true;
}

以下はコンソール出力です。

ui: false
ui2: true

どうすれば、両方とも true ?

どのように解決するのですか?

私の推測では、(コードを削除していない限り)それは不可能です。しかし、必要なコンストラクタを実装するだけではどうでしょうか。Lombok はあなたの生活を楽にするためのものであり、Lombok で動作しないものは、昔ながらの方法で行えばよいのです。

@Data
@Builder
@AllArgsConstructor
public class UserInfo { 
    private int id;
    private String nick;
    @Builder.Default
    private boolean isEmailConfirmed = true;
    
    public UserInfo(){
        isEmailConfirmed = true;
    }
}

コンソール出力です。

ui: true
ui2: true

更新

2021年1月現在。 このバグは Lombok では修正されたようです。 少なくとも生成されたコンストラクタでは修正されているようです。ただし、まだ 同様の問題が を混ぜるときに Builder.Default と明示的なコンストラクタが混在する場合です。