12

当我编码时,我对空检查感到沮丧。特别是在编码数据结构时!

我必须这样做

String val;
if(a != null && a.child != null)
    val = a.child.getValue();
else
    val = null;

这种东西...

有没有这样的运营商?(这是 C# 的一部分)为 Java 减轻负担?

С# 示例:

String val = a?.child?.getValue();
4

6 回答 6

9

与 Java 中的大多数事情一样,您必须以冗长的方式来完成它。嘿,至少它更具可读性 - 如果你必须做一个空检查,为什么不让它明确且容易看到(在这里扮演魔鬼的拥护者)

于 2014-11-22T05:47:31.867 回答
4

没有?。Java 中的运算符,因此,正如 Hari 所指出的,您必须以“啰嗦”的方式做事。但是,有人可能会争辩说这是一件好事,因为它不鼓励使用空值。

例如,在 OP 的代码中,null如果 a 或它的孩子不存在,为什么要将 val 设置为?让我们假设这是一个函数并且 val 被返回。这是一种代码异味:它只是将另一个空值检查的要求推送给代码的用户。 它变成了一个无休止的空检查循环,使代码完全混乱,逻辑混乱,因为维护程序员通常无法判断这是否是合法的逻辑,或者偏执的前程序员正在悄悄地忽略错误。 不要模仿 PHP!. 引用那句出色的咆哮:

“当面临做一些荒谬的事情或因错误而中止时,它 (PHP) 会做一些荒谬的事情。”

PHP 做出了可怕的设计选择。 出错中止比做一些无意义的事情要好得多。

相反,您应该提出以下问题:

  1. a 为空是什么意思?这是编程错误吗?如果是这样,抛出一些 RuntimeException / IllegalArgumentException。如果这是关键代码并且您“不会失败”,请至少记录您正在掩盖一些可疑的东西,所以它可能会得到修复。
  2. 如果 a.child.getValue() 本身返回 null 怎么办? 我的调用者将如何区分该 null 和“a or child is null” null 之间的区别? 他们不能
  3. 如果有一个好的默认值,请使用它。如果您使用的是集合或数组,请不要传递 null 来表示“空”。传递 a Collections.emptyXXX(),例如emptyList或空数组。与其将 String 设置为 null,不如考虑将其设置为空 string ""。顺便说一句,这让你hashCode(), equals(), and compareTo()更简单!
  4. 使用空对象模式。. 如果 a 是 Foo 的一个实例,则定义一个静态 final Foo.NULL ,它确实有一个孩子,其值本身就是“nullish”——null 或“”。

有时你真的不能做任何这些事情。参数为空是有正当理由的,或者您必须允许与以前的不良设计或第 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()很多电话。编写一个小实用函数来处理这个问题并处理空值。与其到处都是冗长的空检查,至少它们被封装在一些实用方法中。干燥。而且,可以说检查是冗长的事实,鼓励你做一个更好的设计。所以缺少?。运营商是个好东西,对吧?:-)

于 2014-11-22T16:27:21.937 回答
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();
于 2014-11-22T05:53:10.433 回答
1

Java 中没有这样的运算符。我能想到的最接近 Java 支持的是Yoda 条件,它允许您根据常量检查值,例如

if ("test".equals(str))

代替

if (str != null && str.equals("test"))
于 2014-11-22T05:52:51.233 回答
1

没有没有?JAVA中的运算符。您可以使用 != 运算符检查不为空

String val = (a != null && a.child !== null) ? a.child.getValue() : null; 
于 2014-11-22T06:08:26.393 回答
0

Java 中没有这样的运算符。

 str != null && str.equals("test")
于 2018-05-06T06:31:09.357 回答