在浏览我正在使用的库的某些代码时,我遇到了这段代码:
public class SomeClass {
private static final class Null {
/* ... */
}
public static final Object NULL = new Null();
}
这是一种常见做法,为使用的类而不是Java的null
使用特殊的NULL对象吗?这样做有什么好处,而不是使用内置null
的Java?
我很好奇的主要原因是在使用库时,我一直在检查SomeClass是否为null,而没有意识到他们使用了一个特殊的NULL对象来表示SomeClass的null对象。
编辑:对于那些想知道的人来说,来源的确切代码是:
public class JSONObject {
private static final class Null {
protected final Object clone() {
return this;
}
public boolean equals(Object object) {
return object == null || object == this;
}
public String toString() {
return "null";
}
}
public static final Object NULL = new Null();
}
答案 0 :(得分:10)
null object pattern偶尔可能是有用的 - 因此您不使用空引用,而是具有中性行为的实际对象。但是,你在那里实现的实现没有意义:
Null
没有扩展SomeClass,我希望它能NULL
被声明为Object
,而不是SomeClass
。就这样,我会说代码没用。但是如果正确实施,模式可能会很有用。
答案 1 :(得分:2)
这是“空对象模式”。优点是您不必显式检查null,从而避免使用NPE。
答案 2 :(得分:1)
他们班级的更好名称应为Empty
或类似名称。使用java关键字的变体并不是一个好主意 - 它会导致混淆......以及类似的问题。
此外,通常空对象是类的特殊实例:
public class SomeClass {
public static final SomeClass EMPTY = new SomeClass("parameters that make it empty");
}
答案 3 :(得分:1)
这取决于使用情况。可以有NULL类,例如,表示Null数据类型,它与java中的null不同。这里有一个例子:http://www.snmp4j.org/doc/org/snmp4j/smi/Null.html
否则,在NULL对象中包装null值不是惯用的java。
答案 4 :(得分:1)
我曾经在我的项目中使用过一次并且不会再这样做了,因为在序列化
时它很棘手