我常常调用可能返回null值的外来方法。为了避免简单的空检查,如
if (myVariable != null) {
// do something
}
我有时会指定一个默认值,如下所示:
myVariable = (myVariable == null) ? defaultValue : myVariable;
例如,在Ruby中这似乎有点多余,有||=
运算符
我不是要求这样的运算符,但我使用三元运算符的标准方法似乎有点多余或可能也令人困惑?
有哪些更好的方法?
答案 0 :(得分:3)
试试这个:
if (myVariable == null) {
myVariable = defaultValue;
}
答案 1 :(得分:0)
如果外来方法可能返回null值,则应注意方法的Java文档中的null返回值。客户端使用那个外来方法必须检查,但没办法,返回值。
执行此操作的简单方法:
retVal = alienMethod();
if (retVal == null) {
retVal = defaultVal;
}
如果您仍想避免检查空值,则返回值的方法必须负责返回默认值。但是你的默认值是多少?根据您的返回类型,您可以创建一个虚拟类来表示您的默认值,而不是返回空值。
答案 2 :(得分: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
答案 3 :(得分:0)
一般来说,没有“优雅”的方式。如果变量是类的字段,则可以在setter或getter中执行。但正确的javadocs(我没有在下面显示!)对于解释nulls会发生什么很重要。 e.g。
public void setFoo(Foo foo) {
this.foo = foo != null ? foo : DEFAULT_FOO;
}
public Foo getFoo() {
return foo != null ? foo : DEFAULT_FOO;
}
答案 4 :(得分:0)
您可以将默认值的赋值包装到一个小的实用程序函数中,并将其放在一个帮助器类中。对于String
类型的变量,这将如下所示:
public static String unNull(String val,String defVal) {
return (val==null ? defVal : val);
}
然后,在你的代码中你可以写
myVariable = unNull(alienMethod(),defaultValue);
使用静态导入,您可以不使用类名称为静态方法的名称添加前缀。
您还可以创建一个通用方法来处理这个问题(模板化两个参数的类型和返回类型),但我不确定它是否可以在没有Class
类型的附加参数的情况下工作。
答案 5 :(得分:0)
最后有一种更好的方法:Java 8中的Optional
而不是
Foo myVariable = bar();
myVariable = (myVariable == null) ? defaultValue : myVariable;
bar()
可能会返回null
,现在你可以
Foo myVariable = Optional.ofNullable(bar()).orElse(defaultValue).get()