当我编码时,我对空检查感到沮丧。特别是在编码数据结构时!
我必须这样做
String val;
if(a != null && a.child != null)
val = a.child.getValue();
else
val = null;
有点像......
是否有类似的运营商? (这是C#的一部分),Java可以缩短负担吗?
С#example:
String val = a?.child?.getValue();
答案 0 :(得分:6)
没有
与Java中的大多数事情一样,您必须以漫长的方式进行。嘿,至少它更具可读性 - 如果你必须进行空检查,为什么不明确并且容易看到它(在这里扮演魔鬼的拥护者)
答案 1 :(得分:2)
?.
运算符在Java中不存在。
"大多数"紧凑,你可以做的是?:
三元运算符,你可以"链":
String val = a != null && a.child != null ? a.child.getValue() : null;
或
String val = a == null ? null : a.child == null ? null : a.child.getValue();
答案 2 :(得分:2)
没有? Java中的操作符,因此,正如Hari所说,你必须做的事情是长期啰嗦"办法。但是,有人可能会认为这是好的事情,因为它不鼓励使用空值。
例如,在OP的代码中,如果一个或它的孩子不存在,为什么要将val设置为null
?让我们假设这是一个函数,并返回val。这是一个代码味道:它只是向代码用户推送了另一个空检查的要求。它变成了无限循环的空检查,完全混乱了代码并混淆了逻辑,因为维护程序员通常无法判断这是否是合法的逻辑,或者偏执的前程序员正在悄悄地忽略错误。 Don't mimic PHP!。引用那种出色的咆哮:
"当面对无意义的事情或因错误而中止时,它(PHP)会做一些荒谬的事情。"
PHP做出了糟糕的设计选择。 使用错误中止比使用无意义的内容要好得多。
相反,你应该问类似的问题:
Collections.emptyXXX()
,例如an emptyList或空数组。不要将String设置为null,而应考虑将其设置为空字符串""
。顺便说一句,这使你的hashCode(), equals(), and compareTo()
更加简单! 有时你真的不能做这些事情。参数为null的正确理由,或者您必须允许向后兼容先前的错误设计或第三方库。 IMO,这应该是罕见的,你应该记录发生的事情。也许你应该返回null(或0)以外的东西来反映这一点。例如
/**
countPeople
@param node null means the foobar can't connect to the database,
@return Foobar.ERR_NO_DB if node is null
*/
在OP的例子中,它看起来可能是某种XML节点,Java XML接口非常庞大,为其中一个创建一个好的NULL对象将是一项艰巨的任务。 (嗯,也许是一个很好的小开源项目?)。但是,在这种情况下,您可能会多次调用a.child.getValue()
。编写一个小实用程序函数来处理它并处理空值。而不是在任何地方进行冗长的空检查,至少它们被封装在一些实用方法中。干。并且,可以说这些检查是冗长的,鼓励你做一个更好的设计。那么缺乏?操作员是件好事,对吧? : - )
答案 3 :(得分:1)
Java中没有这样的运算符。我能想到的最接近的东西是Yoda conditions,它允许你检查一个常量的值,如
if ("test".equals(str))
而不是
if (str != null && str.equals("test"))
答案 4 :(得分:1)
不,没有? JAVA的运营商。您可以使用!=运算符来检查非空
String val = (a != null && a.child !== null) ? a.child.getValue() : null;
答案 5 :(得分:0)
Java中没有这样的运算符。
str != null && str.equals("test")