2010-01-27 7 views
12

Java에서는 최종 클래스를 확장 할 수 없다는 것을 알고 있습니다. 그러나 최종 수업을 연장하는 효과를 얻는 다른 방법이 있습니까?Java에서 최종 클래스를 확장하는 것과 같습니다.

내가 찾고있는 요구 사항을 가진 최종 수업이 있으므로 어떻게 든 다시 사용할 수 있다면 나에게 큰 도움이 될 것입니다.

답변

27

마지막 클래스의 래퍼를 만드시겠습니까? 이 같은

뭔가 :

class MyClass { 
    private FinalClass finalClass; 

    public MyClass { 
     finalClass = new FinalClass(): 
    } 

    public void delegatingMethod() { 
     finalClass.delegatingMethod(); 
    } 
} 

MyClass 같은 래퍼 클래스가 FinalClass의 인스턴스로 허용되지 않습니다. FinalClass이 인터페이스를 구현하면 MyClass에 인터페이스를 구현하여 클래스를 더 비슷하게 만들 수 있습니다. FinalClass의 최종 부모가 아닌 경우에도 마찬가지입니다. 이 경우 귀하의 MyClass 디자인은 부모 클래스와 호환되어야합니다.

리플렉션을 사용하여 런타임 중에 래퍼 클래스를 만들 수도 있습니다. 이 경우 Proxy class을 사용할 수 있습니다. 프록시 클래스는 Java 유형 시스템에 대한 심층적 인 지식이 필요합니다.

+1

실제로 래핑되는 클래스가 일종의 인터페이스/추상 클래스를 구현하고 원본 대신 래퍼 인스턴스를 제공 할 수있는 경우에만 작동합니다. 이 중 하나를 수행 할 수 없다면 원본을 리팩토링하지 않아도됩니다. –

+0

물론 FinalClass의 모든 인스턴스를 MyClass로 바꿀 수는 없습니다. 그러나 MyClass로 FinalClass를 래핑하기위한 인터페이스를 직접 정의 할 수 있습니다. FinalClass를 MyClass 외부에서 참조하지 마십시오. – Arne

+0

@ArneJan, 다른 클래스의 'finalClass' 필드를 참조해서는 안된다는 뜻입니까? 왜? –

3

가장 간단한 옵션은 최종 클래스의 인스턴스를 멤버 변수로 포함하고 최종 클래스의 프록시 역할을하는 래퍼를 작성하는 것입니다.

이렇게하면 최종 클래스의 메서드를 재정의하거나 확장하는 것이 쉽습니다.

관련 문제