在java中避免使用!= null有什么好处?

时间:2012-07-20 04:58:49

标签: java null

我已阅读此主题:Avoiding != null statements但我看不到任何好处。

  1. 如果返回空数组,则需要检查“真实”数组的位置以及空数组的位置。

  2. 您必须使用getName() != null,而不是使用getName().length > 0之类的代码。作为一个例子,我正在研究项目,我需要用少量的归档器来压缩一些数据,并决定选择尺寸最小的压缩数据。如果我从归档器“compress”方法返回null,我需要检查返回的值是否为null。如果我决定返回一个空数组,那么我还需要检查它是否为空。

  3. 我是对的吗?

3 个答案:

答案 0 :(得分:11)

使用空集合或“空白”操作而不是null的主要优点是,大多数情况下,此类对象仍然可以在代码中工作而无需进一步修改。 null值的核心因其性质而更容易出错。

请使用以下代码,例如:

String[] names = data.getNames();
if (names != null) {
    for (String name : names) {
        // Do stuff
    }
}

需要检查null,否则您将获得NPE。使用标准for循环不能解决问题。另一方面,如果你知道你将总是获得某种类型的数组,那么你的代码将 fine ,而无需额外的检查。如果数组为空,则循环将不会运行。问题解决了。

对于实现某种形式的操作的代码也是如此。另一个例子:

Action myAction = data.getActionToRun();
if (myAction != null) {
    myAction.run();
}

再一次,您需要null检查。如果确保操作存在,那么您始终可以在没有副作用的情况下调用action.run(),但空白操作不会执行任何操作。就这么简单。

在许多情况下,如果修改方法的返回方式,则可以简单地丢弃null个检查,从而产生更简单易懂的代码。在某些情况下,返回null正确的选项(例如,从一组键和值中获取对象),因为没有默认的“无动作”值。但是null表示根本没有值,并且需要额外的处理才能成为接收者。使用空白,无动作,非空对象允许数据对象处理错误。这是很好的封装。这是很好的编程。它只是有效。™

最后,返回null肯定不是处理错误的好方法。如果您的代码出现问题从不出错,除非您作为程序员犯了编程错误,请使用assert或异常。那些都是失败的。不要将null用作失败案例,将其用作简单的缺少值。

答案 1 :(得分:7)

空数组有时会返回更自然的对象。考虑一下这样的代码:

String [] elements = getElements();

for (String element : elements)
   System.out.println(element);

如果返回一个空数组(即没有元素),则不打印任何内容,代码将正确执行。但是,如果getElements()返回null,您将获得空指针异常。为了防止它,你需要添加更多的代码,这使事情变得更加复杂。返回一个空数组可以在没有附加代码的情况下实现所需的行为。

答案 2 :(得分:1)

我有一段时间的想法。 暂时搁置NPE问题。我会尝试从OOP的角度解释我的想法。

假设您编写了一个为Glass实例提供getter的类 public Glass getGlass()。 当我读到这个签名时,我期待一些Glass接口的实例,而null则不是一个。

您可以考虑下一个方法public Optional<Glass> getGlass()

Optional类(可以编写自己的类或使用Google's guava Optional)包含您的泛型类实例,同时提供 isPresent 函数。 这可能看起来多余,因为您可以从客户端代码中使用getGlass() != null而不是getGlass().isPresent()。但这里的主要优点是签名很简单。没有人隐藏任何东西,你不必猜测。

所以你得到了以下好处:

  1. 避免NPE的
  2. 直截了当的签名
  3. 清理客户端代码