【问题标题】:Optional in Lombok龙目岛可选
【发布时间】:2015-10-18 16:23:31
【问题描述】:

我有一个名为 Address 的类,如下所示:

@Value
class Address {

   @NotNull String userId;
   @NotNull String line1;
   String line2;

   private Address(Builder b) {
      // copy everything from builder
   }

   // override getter for line2 so that it returns Optional<String>
   public Optional<String> getLine2() {
      return Optional.ofNullable(this.line2);
   }

   // and a Builder
   public static class Builder {
     // builder methods
   }
}

这里我不得不写BuilderGetter,因为如果我想在使用Lombok 时返回一个Optional,我必须将line2 声明为Optional&lt;String&gt;。这将生成一个接受 Optional&lt;String&gt;!

的构建器方法

有没有其他方法可以将 lombok 与 Optional 一起使用?

【问题讨论】:

    标签: java optional lombok


    【解决方案1】:

    答案是否定的,而且可能永远不会。

    您可能做错了:-) Optional 不是null 的替代品,也不是防止NullPointerException 的奇特方式。这是为了表明这个问题是无法回答的,例如:一个空列表的平均年龄是多少。

    Optionals 永远不应被传递,而应尽快被调用代码拆箱。

    另见https://www.voxxed.com/blog/2015/01/embracing-void-6-refined-tricks-dealing-nulls-java/

    由于这些场景很少,而且 Lombok 喜欢让程序员编写更好的代码,我不认为 Lombok 会支持它。

    披露:我是 Lombok 开发人员。

    【讨论】:

    • 非常感谢您回答这个问题!谢谢!我知道不使用Optional 代替null 的理念。如果在 getter 中使用,它将过度使用 Optional。但是还有另外一个更方便的,Google Guava 开发者的哲学,允许你使用 Optional 来代替 nullGuava's Optional 所以,我个人认为lombok 应该保持中立,提供对 autoOptional 的支持,而留下是否给程序员用不用
    • 我的意思是生成的 getter 看起来像代码示例 here 并且会通过 @Getter( optional = true ) 之类的东西添加。
    • @Getter( optional = true ) 绝对是一个很大的肯定,这会让我非常高兴。
    • "Optional 不是 null 的替代品,也不是防止 NullPointerException 的奇特方式" is 是一种允许无 null 代码的构造,并且 Java 可以以函数式方式编写。只需查看 Javaslang。
    • @RoelSpilker 为什么不使用@Getter(optional = true) 在可空字段的getter 中生成Optional 返回类型?即那些没有标记@NonNull?
    猜你喜欢
    • 2021-10-02
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2011-06-19
    • 2017-01-16
    • 2015-04-04
    • 2018-04-11
    相关资源
    最近更新 更多