为空对象提供方法返回值是否有用?
能够为空对象提供方法返回值是否有用?
对于列表,空返回值可能是:
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; }