2

我经常调用可能返回空值的外星方法。为了避免简单的空检查,如

if (myVariable != null) {
     // do something
}

我有时会分配一个默认值,如下所示:

myVariable = (myVariable == null) ? defaultValue : myVariable;

例如,这在 Ruby 中似乎有点多余,有||=运算符

我不是在要求这样的运算符,但我使用三元运算符的标准方法似乎有点多余,或者也可能令人困惑?

有什么更好的方法?

4

6 回答 6

4

试试这个:

if (myVariable == null) {
    myVariable = defaultValue;
}
于 2012-05-18T15:22:24.193 回答
0

如果外星人方法可能返回 null 值,则应注意方法的 Java 文档中的 null 返回值。客户端使用那个外星人方法必须检查,但没办法,返回值。

执行此操作的简单方法:

retVal = alienMethod();
if (retVal == null) {
    retVal = defaultVal;
}

如果您仍然想避免检查空值,则返回值的方法必须负责返回默认值。但是你的默认值是多少?根据您的返回类型,您可以创建一个虚拟类来表示您的默认值,而不是返回空值。

于 2012-05-18T15:26:14.423 回答
0

没有更好/更短/更好的方法来做到这一点......

有人谈论引入“?” Java 7 中的 null 值运算符,但这个概念已经从版本中移出....也许适用于 Java 8 ?

https://blogs.oracle.com/darcy/entry/project_coin_final_five

http://viralpatel.net/blogs/2009/10/null-safe-type-java-7-nullpointerexception.html

http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000047.html

于 2012-05-18T15:33:45.213 回答
0

一般来说,没有“优雅”的方式。如果变量是你的类的一个字段,你可以在 setter 或 getter 中做。但是正确的 javadocs(我没有在下面显示!)对于解释 null 会发生什么很重要。例如

   public void setFoo(Foo foo) {
      this.foo = foo != null ? foo : DEFAULT_FOO;
   }

   public Foo getFoo() {
      return foo != null ? foo : DEFAULT_FOO;
   }
于 2012-05-18T15:38:46.457 回答
0

您可以将默认值的分配包装到一个小的实用程序函数中,并将其放入帮助程序类中。对于 type 的变量String,这看起来像这样:

public static String unNull(String val,String defVal) {
    return (val==null ? defVal : val);
}

然后,在您的代码中,您可以编写

myVariable = unNull(alienMethod(),defaultValue);

使用静态导入,您可以不用在静态方法的名称前加上类名前缀。

您还可以创建一个通用方法来处理这个问题(以模板化参数的类型和返回类型),但我不确定如果没有额外的 type 参数它会起作用Class

于 2012-05-18T17:05:47.353 回答
0

终于有一种更好的方法来做到这一点:Optional在 Java 8 中。而不是

Foo myVariable = bar();
myVariable = (myVariable == null) ? defaultValue : myVariable;

哪里bar()可以回来null,现在你做

Foo myVariable = Optional.ofNullable(bar()).orElse(defaultValue).get()
于 2016-01-29T06:02:42.690 回答