【问题标题】:Passing Optional.absent() values to methods concisely将 Optional.absent() 值简洁地传递给方法
【发布时间】:2012-08-01 11:09:11
【问题描述】:

使用 Guava 的 Optional 类型作为方法参数的一个问题是您不能简单地编写

// method declaration
public void foo(Optional<String> arg);

// compiler error
foo(Optional.absent());

由于类型推断失败,而是必须显式添加类型:

// real method call
foo(Optional.<String> absent());

如何避免?

【问题讨论】:

  • 实际上并没有更好的方法,但仅供参考,Optional 往往更常用作返回值而不是方法参数类型。 (忘记方法的返回值可能比您正在编写的方法的参数更容易忘记。)
  • 使用复杂的表达式,我使用适当类型的局部变量(在赋值的 RHS 上不需要类型变量)以获得更具可读性的内容。但在解决方案到来之前,这里什么都做不了(可能是 JDK8)。
  • @LouisWasserman 使用Optional 作为参数仍然有好处:1) 让 API 用户清楚地知道参数可以不存在; 2) 轻松将另一个方法的返回值传递给您的方法。
  • 我将 Optional 与 Jersey 框架结合使用。例如。调用方法时可能未给出 @QueryParameter。但是,当我编写单元测试时,我需要使用键入的缺席 Optional 进行调用

标签: java generics guava


【解决方案1】:

如果您正在处理一小部分 Optional&lt;&gt; 类型(例如,主要是字符串或少数其他类型),只需创建一些为您绑定类型参数的辅助方法:

public final class AbsentValues {
    public static Optional<String> absentString() {
        return Optional.<String>absent();
    }
}

您甚至可以静态导入这些以生成更简洁的代码:

import static AbsentValues.*;

...

foo(absentString());

对于不太常见的Optional&lt;&gt; 类型,只需明确指定类型参数即可。它可能不漂亮,但它是正确的。

【讨论】:

    【解决方案2】:

    所以,这是正确的方法。如果没有别的原因,让我至少在这里展示一下,以供我自己将来参考,供像我这样不阅读问题的每个人使用 :) 感谢 ColinD(和 Alexey)。

    foo(Optional.<String>absent())
    

    【讨论】:

      【解决方案3】:

      刚写问题的时候就想到了

      public class GuavaConstants {
          @SuppressWarnings( { "raw" })
          public static final Optional ABSENT = Optional.absent();
      
          // similar for empty ImmutableList, etc.
      }
      

      然后调用看起来像

      @SuppressWarnings( { "unchecked" })
      foo(GuavaConstants.ABSENT);
      

      有更好的方法吗?

      【讨论】:

      • 是的,foo(Optional.&lt;String&gt;absent()) 更好。我觉得这根本不是你应该做的事情。
      • @ColinD,请将此作为答案发布,我会立即对其进行投票。接受的(也是唯一的)答案非常讨厌。
      猜你喜欢
      • 2010-10-06
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 2011-12-07
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多