当我编码时,我对空检查感到沮丧。特别是在编码数据结构时!
我必须这样做
String val;
if(a != null && a.child != null)
val = a.child.getValue();
else
val = null;
这种东西...
有没有这样的运营商?(这是 C# 的一部分)为 Java 减轻负担?
С# 示例:
String val = a?.child?.getValue();
当我编码时,我对空检查感到沮丧。特别是在编码数据结构时!
我必须这样做
String val;
if(a != null && a.child != null)
val = a.child.getValue();
else
val = null;
这种东西...
有没有这样的运营商?(这是 C# 的一部分)为 Java 减轻负担?
С# 示例:
String val = a?.child?.getValue();
不
与 Java 中的大多数事情一样,您必须以冗长的方式来完成它。嘿,至少它更具可读性 - 如果你必须做一个空检查,为什么不让它明确且容易看到(在这里扮演魔鬼的拥护者)
没有?。Java 中的运算符,因此,正如 Hari 所指出的,您必须以“啰嗦”的方式做事。但是,有人可能会争辩说这是一件好事,因为它不鼓励使用空值。
例如,在 OP 的代码中,null
如果 a 或它的孩子不存在,为什么要将 val 设置为?让我们假设这是一个函数并且 val 被返回。这是一种代码异味:它只是将另一个空值检查的要求推送给代码的用户。 它变成了一个无休止的空检查循环,使代码完全混乱,逻辑混乱,因为维护程序员通常无法判断这是否是合法的逻辑,或者偏执的前程序员正在悄悄地忽略错误。 不要模仿 PHP!. 引用那句出色的咆哮:
“当面临做一些荒谬的事情或因错误而中止时,它 (PHP) 会做一些荒谬的事情。”
PHP 做出了可怕的设计选择。 出错中止比做一些无意义的事情要好得多。
相反,您应该提出以下问题:
Collections.emptyXXX()
,例如emptyList或空数组。与其将 String 设置为 null,不如考虑将其设置为空 string ""
。顺便说一句,这让你hashCode(), equals(), and compareTo()
更简单! 有时你真的不能做任何这些事情。参数为空是有正当理由的,或者您必须允许与以前的不良设计或第 3 方库向后兼容。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 的示例中,a 看起来可能是某种 XML 节点,并且 Java XML 接口非常庞大,为其中一个创建一个好的 NULL 对象将是一项艰巨的任务。(嗯,也许是一个不错的小开源项目?)。但是,在这种情况下,您可能会打a.child.getValue()
很多电话。编写一个小实用函数来处理这个问题并处理空值。与其到处都是冗长的空检查,至少它们被封装在一些实用方法中。干燥。而且,可以说检查是冗长的事实,鼓励你做一个更好的设计。所以缺少?。运营商是个好东西,对吧?:-)
?.
Java 中不存在该运算符。
您可以做的“最”紧凑的是?:
您可以“链接”的三元运算符:
String val = a != null && a.child != null ? a.child.getValue() : null;
或者
String val = a == null ? null : a.child == null ? null : a.child.getValue();
Java 中没有这样的运算符。我能想到的最接近 Java 支持的是Yoda 条件,它允许您根据常量检查值,例如
if ("test".equals(str))
代替
if (str != null && str.equals("test"))
没有没有?JAVA中的运算符。您可以使用 != 运算符检查不为空
String val = (a != null && a.child !== null) ? a.child.getValue() : null;
Java 中没有这样的运算符。
str != null && str.equals("test")