【问题标题】:Default field value with @Builder or @Getter annotation in LombokLombok 中带有 @Builder 或 @Getter 注释的默认字段值
【发布时间】:2017-03-11 21:34:37
【问题描述】:

我正在使用 Lombok @Builder 注释,但我希望某些 String 字段是可选的并且默认为 "" 以避免 NPE。是否有捷径可寻?我什么都找不到。

或者,如果变量为null,则自定义@Getter 以返回默认值。

【问题讨论】:

    标签: java getter builder lombok


    【解决方案1】:

    您必须提供如下所示的构建器类:

    @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,那么魔法就消失了!

      使用您更喜欢的方法完全取决于您。

      【讨论】:

      • 您忘记了new XYZ() 中的()
      • @HazelTroost 已修复
      【解决方案3】:

      从版本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。如果它不应该是可设置的 在构建过程中,将字段设为最终状态。

      【讨论】:

      • 一点都不好!如果您使用@Default.Builder @NoArgsConstructor(我知道这没有意义有时由于某些框架您必须不提供任何参数构造函数),初始化器在默认构造函数中使用!这是一个严重的错误。
      • 是的,我同意你的看法; lombok 生成代码的设计不是很好(检查生成的类是个好主意)。一种解决方法,自己编写无参数构造函数。
      • 听起来他们在 v1.18.2(2018 年 7 月 26 日)中修复了这个问题。功能:NoArgsConstructor 现在考虑使用 Builder.Default 设置的任何默认值。问题 #1347
      猜你喜欢
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多