我想弃用特定方法。此方法现在需要一个新参数,但我希望保留以前的实现以实现向后兼容。
我应该只在超类(在library-api项目中),子类(在library-impl项目中)或两者中添加@Deprecated
注释吗?
答案 0 :(得分:2)
@Deprecated
注释未使用@Inherited
进行注释。因此,注释不会自动应用于继承的方法。
这不一定是个问题,因为IDE通常会检查声明的类型。因此,如果您在超类/接口上弃用该方法,即使您使用未明确弃用该方法的子类/实现,IDE也会抱怨。我的意思是:
SomeType x = new Abc(); // where Abc is an implementation or subclass of SomeType
x.doSomething(); // IDE should still complain if SomeType#doSomething() is deprecated
如果使用implementsor / subclass而不是interface / superclass进行类型声明,那么您可能需要在实现/重写方法上使用@Deprecated
注释。很大程度上取决于代码分析器。从理论上讲,它仍然可以检查接口/超类的弃用,即使你没有将它用于类型声明。
Abc x = new Abc();
x.doSomething(); // here you're on your own if Abc#doSomething() is not deprecated
答案 1 :(得分:1)
使用或引用Deprecated
方法的任何方法都会生成编译器警告,除非它本身是Deprecated
(或者它具有相应的@SuppressWarnings("deprecation")
)。
因此,您应该在超类和子类上设置@Deprecated
注释(如Sajan所述)。您还需要使用这些方法以递归方式将其添加到其他方法中。
请注意Rinke在答案中的好评:
@Derecited注释未使用@Inherited注释。该 因此,注释不会自动应用于继承 方法
背后的逻辑是所有使用一些弃用代码的东西(= 不是正确的方式再做,并且在不久的将来被移除),也应该被标记为“不再是正确的方式,并且在不久的将来被删除”。
如果要弃用的方法的行为(代码)用于有用(非弃用)方法,则应该在另一个函数中提取代码,该函数将由我们的其他函数调用代码。
而不是:
@Deprecated
public void someMethodWithBadSignature() {
//some Code
}
public void otherValidMethod() {
someMethodWithBadSignature(); /// <====== WARNING
}
使用:
@Deprecated
public void someMethodWithBadSignature() {
someMethodsCode();
}
private void someMethodCode() {
//your original code
}
public void otherValidMethod() {
someMethodCode();
}