在Java中有一个静态的“NULL”对象?

时间:2011-10-28 20:42:23

标签: java null

在浏览我正在使用的库的某些代码时,我遇到了这段代码:

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

5 个答案:

答案 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)

Null object pattern

我曾经在我的项目中使用过一次并且不会再这样做了,因为在序列化

时它很棘手