将@Deprecated注释添加到超类,子类或两者?

时间:2015-10-21 09:28:18

标签: java annotations deprecated

我想弃用特定方法。此方法现在需要一个新参数,但我希望保留以前的实现以实现向后兼容。

我应该只在超类(在library-api项目中),子类(在library-impl项目中)或两者中添加@Deprecated注释吗?

2 个答案:

答案 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();
}