2016-09-14 1 views
0

전문 트리 컬렉션을 만들고 있는데 null 대신 NIL 개의 노드가 필요합니다. 인위적인 예를 들어 :일반 클래스의 NIL 노드 설계

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

안전하지 않은 업 캐스트를 일반 게터 기능에 적용 할 수 있습니다. 예제는 java.util.Collections EMPTY_LIST와 emptyList() 소스를 참조하십시오.