重写方法的弃用
我在Eclipse IDE中发现了一些奇怪的东西。 假设我有以下类:
public class Super {
@Deprecated
public void doNotUseThisMethod() {
// do magic
}
}
public class Sub extends Super{
@Override
public void doNotUseThisMethod() {
// why is this not deprecated?
}
}
当然,覆盖已弃用的方法应该会导致警告(因为不使用它的原因同样适用)。 仍然在Eclipse Luna和Mars的全新工作空间中,上述代码根本不会产生警告。 我找不到任何方法来启用它。
我发现这个接口错误(如果Super
是一个接口,应该没有警告),这意味着曾经有一个警告。
所以发生了什么事? 是否有任何理由覆盖已弃用的方法不应导致警告? 我可以做些什么来再次启用此功能吗?
JLS在这一点上非常明确(正如大部分观点一样)。
注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它很危险,或者因为存在更好的选择。
Java编译器必须在使用@Deprecated注释其声明的类型,方法,字段或构造函数在明确或隐式声明的构造中使用(覆盖,调用或由名称引用)时产生弃用警告,除非:
这个用法在一个实体中,它本身是用注解@Deprecated注解的; 要么
该用法在注释的实体中用注解@SuppressWarnings(“deprecation”)来抑制警告; 要么
使用和声明都在同一个最外层的类中。
(https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.4.6)
为了完全符合JLS,Eclipse必须在警告中标记您的doNotUseThisMethod()
。 似乎很久以前它曾经这么做过,但在2003年出现了bug 48335,并且这种警告已成为偏好。 如错误注释中所述,默认值为“禁用”。 (默认情况下,应该“启用”,甚至可以远程兼容JLS。随意提交一个错误以改变它。)我还没有做过详尽的搜索,但是由于你看到的行为与此相符,我会走出一条腿,说这就是它自那以来一直如此。
既然这是一种偏好,你可以改变它。 只需进入“窗口 - >首选项”,然后选择“Java - >编译器 - >错误/警告”。 向下滚动到“弃用和受限制的API”,然后选中“信号覆盖或实施弃用方法”旁边的复选框。 右下方有一个下拉框,可以选择“错误”,“警告”或“忽略”。 选择一个你喜欢的。
该设置仅影响您的本地IDE。
要让整个团队使用该设置,您需要设置项目特定设置。 在相同的首选项屏幕上,右上角有一个指向“配置项目特定设置”的链接。 点击它,选择您想要设置偏好的项目,并执行上述相同的操作。 这将在项目的“.settings”文件夹中创建一个名为“org.eclipse.jdt.core.prefs”的文件。 (你不能在包资源管理器中看到它们,你需要在Navigator视图中查看它们)。一旦创建完成,你可以将它们添加到你的源代码控制中,并且它们将适用于你团队中的每个人项目。
是的,你必须为每个项目都做到这一点。
其实这种行为对我来说看起来是正确的:当你重写一个方法是一个符号时,你为它实现了一个新的代码。
为了避免错误,如果您使用不推荐的超级方法,eclipse将引发一个警告:
class Sub extends Super{
@Override
public void doNotUseThisMethod() { // <---------------*
super.doNotUseThisMethod(); // deprecated! <----*
}
}
但是,如果您在不使用废弃的super.method()
情况下覆盖弃用的方法functionallity, 则不会根据定义弃用新方法,因为您已在不使用旧方法的情况下实施该方法 。
public class Sub extends Super{
@Override
public void doNotUseThisMethod() {
// new logic + not using super.method() = not a deprecated method!!
}
}
如果覆盖已弃用的应用程序不应该被使用,那么也必须注释为已弃用,如下所示:
public class Super {
@Deprecated
public void doNotUseThisMethod() {
// do magic
}
}
public class Sub extends Super{
@Override
@Deprecated // <---------------------------*
public void doNotUseThisMethod() { // |
// this is deprecated also!!!! // <-----*
}
}
SIDENOTE :另一个问题是,如果您的方法的名称可能会导致混淆。
但是@Deprecate并不意味着“我们将很快删除这个方法”,这会由于@Override注解而破坏子类的代码? (这就是为什么我需要警告 - 为了防止其他开发人员重写我要删除的方法,但是因为它们甚至不会收到警告。) - Steffi S.
其实这可能会发生开发人员删除该方法,但弃用更多的是关于不使用某些方法中的代码,因为是旧的,然后开发人员做了一个新的名称,并将其弃用作为遗留。
但是......在这种方法被删除的情况下会发生什么?
首先,这意味着Java(或框架,或者utils)版本的改变,这应该仔细做,不推荐使用的方法不会是你唯一的问题。
在这种情况下,您选择主要版本和一些弃用的方法被删除,你不会有太多问题......为什么? 您的IDE将清楚地标记出这个方法出错,并且您只需要删除@Override
注释,让您的重写方法中的逻辑安全。
您需要在实现已弃用的接口/函数的类的开始处使用@SuppressWarnings(“deprecation”)。
链接地址: http://www.djcxy.com/p/33721.html