为null对象设置方法返回值是否有用?

时间:2008-09-19 02:51:10

标签: c# java

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

对于List,null返回值可能是:

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);
}

只有在类或接口定义它并且null检查仍然有效时才会使用它。有时您不想进行空检查,因此将此作为选项似乎是有益的。

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

5 个答案:

答案 0 :(得分:3)

不用检查NULL是很好的,有些语言可以让它更容易 - 例如C#的非NULLable类型,或Haskell,它没有NULL但可以使用Maybe类型构造函数表示缺失值。

NULL与空列表不同。您可以采用以下观点:某人在需要列表的情况下传入NULL会导致编程错误,并且正确的做法是抛出NullPointerException。

接受NULL的典型借口是,通常情况下您不需要列表,并且您不必创建一个空的新List,尤其是在对效率有一些担忧时。您可以在不更改语言的情况下获得许多好处,但是通过使用静态EmptyList,人们可以传入,无需重新初始化。

答案 1 :(得分:2)

这是一个名为Null Object的模式

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

答案 2 :(得分:0)

这是一个好主意。

Smalltalk这样做。

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

对于高级学生,您可以将其分类以制作代理!

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

但是,应用于Foo类型的C#3.0扩展方法将允许:

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

Bar可以像这样构建:

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