为空对象提供方法返回值是否有用?

时间:2020-03-06 14:24:28  来源:igfitidea点击:

能够为空对象提供方法返回值是否有用?

对于列表,空返回值可能是:

get(int) : null
size() : 0
iterator() : empty iterator

这将允许下面的代码具有较少的空检查。

List items = null;

if(something) {
    items = ...
}

for(int index = 0; index < items.size(); index++) {
    Object obj = items.get(index);
}

仅当类或者接口定义了它并且空检查仍然有效时,才使用此方法。有时我们不想进行空检查,因此将其作为选项似乎很有益。

来自:http://jamesjava.blogspot.com/2007/05/method-return-values-for-null-objects.html

解决方案

这是一个好主意。

Smalltalk做到了。

有一个NULL对象。它不是来自Object的。 (Smalltalk是像Java这样的单根类层次结构)

对于高级学生,我们可以将其细分为代理!

这是一个称为空对象的模式

http://en.wikipedia.org/wiki/Null_Object_pattern

Ruby可以做到这一点(以及其他)。它具有nil而不是null,并且是一个对象。

当要返回列表的函数可以返回null时,我dp讨厌。最好返回一个空列表,让用户决定是否要检查null(空)。

不必检查NULL很好,并且某些语言使其变得更容易-例如。 C#的非NULLable类型或者Haskell,它不具有NULL,但可以使用Maybe类型构造函数表示缺失的值。

空值不同于空列表。我们可以得出以下观点:有人在需要列表的NULL中传递消息会导致编程错误,而正确的做法是抛出NullPointerException。

接受NULL的典型借口是,在某些情况下,我们不需要列表,也不必创建一个空的新列表,尤其是当我们担心效率时。我们可以在不更改语言的情况下获得很多好处,但是通过拥有一个可以供人们传递的静态EmptyList,无需重新初始化即可。

在C(以及其他语言)中,这通常是不允许的。没有Foo实例,.net不知道调用Foo的方法还是Foo的子方法。

但是,将C3.0扩展方法应用于Foo类型将允许以下操作:

Foo x = null;
if (x.Bar() == 0)
{
  Console.WriteLine("I win");
}

酒吧可以这样构造:

public static int Bar (this Foo theFoo)
{
  return theFoo == null ? 0 : 1;
}