在泛型类中设计NIL节点

时间:2016-09-14 05:44:30

标签: java

我正在创建一个专家树集合,并希望有NIL个节点而不是null个引用。作为一个人为的例子:

public interface Value<V> {
    boolean hasValue(V value);
}

public class Node<V> implements Value<V> {
    private static final Value<V> NIL = new Value() {
        public boolean hasValue(V value) {
            return false;
        }
    }

    private Value<V> next = NIL;
    private V value;

    public boolean hasValue(V value) {
        return this.value.equals(value) || next.hasValue(value);
    }
}

我意识到此代码是非法的,因为静态成员NIL使用的是泛型V。在java static class Singleton with generic中有一个很好的解释为什么然而这突出表明,无论类型如何,都需要有一个实例。在我的情况下,这样做会很好:NIL的行为是相同的。

在这种情况下有一些简单的解决方法,但在我使用的用例中,有NIL的几个变体,每个变体都会覆盖接口中的行为。

我可以让NIL成为一个单独的类并创建一个新的实例,而不是使用常量,但我正在处理一个非常大的集合,并且不想要许多对象的开销。实际上持有任何国家。

是否有一种优雅的方法来拥有一个常量对象,同时保留覆盖使用泛型类型的方法的能力?如果没有,是否有替代设计可以实现相同的结果?

1 个答案:

答案 0 :(得分:0)

您可以将不安全的上传放到通用的getter函数中。有关示例,请参阅java.util.Collections EMPTY_LIST与emptyList()的来源。