能否为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
答案 0 :(得分:3)
不用检查NULL是很好的,有些语言可以让它更容易 - 例如C#的非NULLable类型,或Haskell,它没有NULL但可以使用Maybe类型构造函数表示缺失值。
NULL与空列表不同。您可以采用以下观点:某人在需要列表的情况下传入NULL会导致编程错误,并且正确的做法是抛出NullPointerException。
接受NULL的典型借口是,通常情况下您不需要列表,并且您不必创建一个空的新List,尤其是在对效率有一些担忧时。您可以在不更改语言的情况下获得许多好处,但是通过使用静态EmptyList,人们可以传入,无需重新初始化。
答案 1 :(得分:2)
这是一个名为Null Object的模式
答案 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;
}