Java : 감가 상각 된 멤버를 무시하는 파생 인터페이스에서 감가 상각 된 경고를 피하는 방법은 무엇입니까?
-
06-07-2019 - |
문제
다음 단순화 된 인터페이스 상속 계층 구조를 고려하십시오.
// Starting point:
public interface Base {
void Foo();
}
public interface Derived extends Base {
}
이동하기위한 것입니다 Foo
.의 방법 Base
인터페이스 Derived
상호 작용:
// Desired end-point:
public interface Base {
}
public interface Derived extends Base {
void Foo();
}
이 파괴 변화의 위상을 위해서는 Base
한동안 인터페이스.
이것은 메소드를 표시하여 달성 할 수 있습니다. Base
인터페이스로 @Deprecated
:
// Intermediate state:
public interface Base {
/**
* @deprecated This method is deprecated as of release X. Derived.Foo should be used instead.
*/
@Deprecated void Foo();
}
public interface Derived extends Base {
void Foo();
}
이 코드를 컴파일하면 컴파일러 경고를받습니다. Derived
:
감가 상각] 인터페이스베이스의 foo ()가 더 이상 사용되지 않았습니다.
이상하게도, 내가 제거하면 @deprecated
문서에서 Base
(그러나 @deprecated를 남겨 두십시오)이 경고는 사라집니다.
이 경고를받는 것이 맞습니까? 그렇다면 어떻게해야합니까?
경고는 그것을 전달하는 것 같습니다 Derived.Foo
"사용" Base.Foo
(더 이상 사용되지 않음). 그러나 유일한 능력 Derived.Foo
더 이상 사용되지 않는 "사용"입니다 Base.Foo
그것을 무시하는 것입니다. 그것은 당신이 파생 된 방법에서 더 이상 사용되지 않은 인터페이스 방법을 무시할 수 없다고 말하는 것 같습니다.
이것이 사실이라면, 나는 장식해야합니다 Derived
~와 함께 @SuppressWarnings("deprecation")
경고를 억제하려면?
해결책
나는 당신의 요구 사항이 유효하다고 생각합니다. 의심 할 여지없이 감가 상승 방법을 무시하는 것이 올바른 방법이라는 것은 의심의 여지가 없습니다.
나는 @deprecated와 @deprecated의 차이가 주로 역사적이라고 생각합니다. @deprecated는 Java 5의 공식적인 방법이지만 새롭기 때문에 @DepRecated로 두 배가 될 것으로 예상됩니다.
또한 슬프게도 @DepRecated는 정보를 지정할 수 없습니다. 예를 들어 정보가 필요하지만, 예를 들어 교체로 사용되어야 할 사항을 알려 주거나 감가 상각 된 방법이 완전히 제거 될 것으로 예상되는 경우에 정보가 필요합니다.
더 많은 것을 알지 못하고 문제가 슈퍼 방법을 효과적으로 제거하자마자 사라질 것입니다. @SuppressWarnings ( "감가 상징")를 사용하여 후임자가 이해할 수있는 의견을 사용하여 ... (및 또 다른 의견에 대한 의견이 있습니다. 수퍼 방법 메소드를 삭제할 때 모든 것을 제거하라고 지시합니다). ;-)
다른 팁
내가 올바르게 이해하면 더 이상 사용되지 않은 인터페이스/함수를 구현하는 클래스의 시작 부분에 @suppresswarnings ( "감가 상각")가 필요합니다. 아니면 내가 여기서 기지에서 벗어나?
Foo ()의 파생 선언에 @deprecated를 추가하면 경고가 사라질 것이라고 생각합니다.
public interface Derived extends Base {
@Deprecated void Foo();
}
당신이 원하는 것을 성취 할 방법이 없습니다.
감가 상징은 비교적 단순히 메커니즘 이며이 유스 케이스를 지원하지 않습니다.
감가 상각이 작동하는 방식은 감가 상징적 인 방법이나 필드를 참조하는 것이 경고를 생성한다는 것입니다.
유일한 예외는 더 이상 사용되지 않은 메소드/필드를 사용하는 코드가 더 이상 사용되지 않는 경우입니다.