2011-02-14 4 views
7

@Deprecated 주석을 사용하여 클래스 내에 포함 된 모든 메서드와 필드가 아니라 특정 클래스의 확장을 비순 내 사용하고 싶습니다.클래스 상속 만 사용 금지

즉, 주어진 클래스를 확장하면 경고가 발생하지만 메소드 나 필드에 대한 참조는 경고를 유발하지 않습니다. 이 클래스를 확장하는 클래스가 이미 여러 개 있습니다.이 클라이언트를 대상으로 deprecation 경고를 사용하고 싶습니다. 아직 해독 할 수는 없지만 다시 컴파일 할 수는 있습니다. ABI 호환성은 필요하지 않습니다.

Java 1.6 (JDT 컴파일러)에서 가능합니까?

+0

지금까지의 답변에 대한 업데이트로 - 종속성을 제거 할 수 없기 때문에 클래스를 계속 확장 할 수 있어야합니다.하지만 그렇게 할 때 더 이상 사용하지 말라고 경고합니다. – BeeOnRope

+1

답변 해 주셔서 감사합니다. 결국 아래의 해결 방법 중 어느 것도 충분하지 않았습니다 (최종 사용은 비 시동기이므로 경고하기를 원하기 때문에 중단하지 마십시오). 그래서 하위 클래스가 사용해야하는 보호 된 생성자를 사용하지 않기로 결정했습니다. 효과 (확장 당 하나의 비추천 경고). – BeeOnRope

답변

5

두 가지 고려 사항

1

) 클래스가 이미 연장 될 수있다, 그래서 최종 표시하지 않거나 당신은 이전 버전과의 호환성을 깰 수 있습니다.

2) 클래스를 확장하지 않으려면 final로 표시해야합니다.

나는 당신이해야 할 일은 새로운 클래스로 기존 클래스를 확장하고, 더 이상 사용되지 않는 기존 클래스를 표시하고, 새로운 클래스 final을 선언하는 것이라고 생각한다. 새로운 클래스에서는 @SuppressWarning 태그를 추가하여 더 이상 사용되지 않는 메시지를 없앨 수 있습니다. 그러면 깨끗한 컴파일을 얻을 수 있습니다. 기존의 클래스를 사용하여

코드는 @Deprecated 경고를 얻을 것이다, 그러나 아직도 .. 코드가 깨끗하게 컴파일 새 클래스를 사용하여 컴파일합니다. 이전 버전과 호환되는 휴식 대신 사용자에게 "강력한 제안"을하고 API가 100 % 호환되기 때문에 수정하기 쉽습니다.

+0

답변을 표시하는 것은 내가 필요로하는 시간에 가장 많이 맞았 기 때문이다. 소비자에게 클래스를 확장하는 것에 대해 경고하고 각 메소드 호출을 실제로 경고하거나 경고하지 않고 경고한다. – BeeOnRope

4

나는 @Deprecated 주석을 사용하여 이것이 가능하다고 생각하지 않습니다.

당신은 그러나 다음을 수행 할 수있는 소스를 제어하는 ​​경우 :

  1. SomeClass라는 새로운 클래스를 만듭니다 SomeClassSuper
  2. 에 현재 클래스 SomeClass의 이름을 변경하고 SomeClassSuper을 확장 할 수 있습니다.
  3. SomeClass (클라이언트의 확장을 막음)으로 설정하십시오. 이다

class SomeClass { 
    // ... 
} 

class SubClass extends SomeClass { 
    // ... 
} 

에서

class SomeClassSuper { 
    // ... 
} 

class SubClass extends SomeClassSuper { 
    // ... 
} 

final class SomeClass extends SomeClassSuper { 
    // ... 
} 
+0

좋은 아이디어 (+1). – Bozho

1

아니, 아니 방법으로 이동합니다. 클래스 final을 만들 수 있지만 기존 확장을 깨뜨릴 수 있습니다.

아마도 APT 용 사용자 지정 프로세서를 개발하여 가능합니다. 그러나 일반적인 경우에는 시행되지 않을 것입니다.

0

@Deprecated 주석이이 기능을 지원하지 않습니다, 당신은 당신의 클래스 final를 대신 표시해야합니다. 이로 인해 컴파일러 오류가 발생하지만 논리적이므로 클래스를 확장해도 안전합니다. 그렇지 않으면 오류가 발생합니다.

1

당신이 아마 개인이 필요한 기능 (후손들이 접근 할 필요가 예를 들어, 생성자를) 확인 및 확장 사용해야하는 것 + 보호되지 않는 생성자를 제공 할 수있는 설계를 맞는 경우.