我正在创建一个专家树集合,并希望有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
成为一个单独的类并创建一个新的实例,而不是使用常量,但我正在处理一个非常大的集合,并且不想要许多对象的开销。实际上持有任何国家。
是否有一种优雅的方法来拥有一个常量对象,同时保留覆盖使用泛型类型的方法的能力?如果没有,是否有替代设计可以实现相同的结果?
答案 0 :(得分:0)
您可以将不安全的上传放到通用的getter函数中。有关示例,请参阅java.util.Collections EMPTY_LIST与emptyList()的来源。