显示同一类方法的已弃用警告

时间:2015-03-12 19:14:49

标签: java eclipse annotations deprecated

使用eclipse,我希望只要任何我使用过的方法被标记为@Deprecated,就会看到警告。如果是这样,方法调用被正确划掉,但如果方法来自同一个类,则eclipse不会发出警告。请参见下面的屏幕截图。

Eclipse_warnings

为了更好地再现,我还将提供textform中的代码:

/* MainClass.java */
public class MainClass {
    public static void main(String[] args) {
        MainClass.foo();
        MemberClass.foo();
        OtherClass.foo();
    }
    @Deprecated
    public static void foo() {
        return;
    }
    private static class MemberClass {
        @Deprecated
        protected static void foo() {
            return;
        }
    }
}

/* OtherClass.java */
public class OtherClass {
    @Deprecated
    public static void foo() {
        return;
    }
}

而只有OtherClass.foo()会生成警告。为什么?我该如何解决这个问题?

  • Enable project specific settings已停用
  • Window - > Preferences - > Java - > Compiler - > Errors/Warnings - > Deprecated and restricted API如果完全设置为Warning,如上图所示。

注意:Eclipse not showing deprecated warning? 相关

1 个答案:

答案 0 :(得分:3)

@Deprecated注释的确切定义不在javadoc中,但实际上在Java Language Specification第9.6.4.6节中。

基本上它表示使用不推荐使用的元素会产生警告,除非

  

使用和声明都在同一个最外层。

由于MainClass.foo()MemberClass.foo()都在MainClass范围内,并且您对它们的调用也在MainClass中,因此不会生成任何警告。

OtherClass.foo()的调用不属于同一个最外层,因此会产生警告。

我认为这个规则的原因是可以假定最外层或顶层类中的代码一起维护和发展。不推荐使用元素通常是代码"外部的信号,"可能由其他人维护,这个元素会发生一些事情。通常在课堂上适用不同的规则。内部使用已弃用的元素(如私有元素)可能非常好。

对于编译器或IDE来说,发出超出JLS要求的附加警告可能是合法的,例如在同一个最外层的类中使用不推荐使用的元素。但是,我不知道有任何系统可以做到这一点。

但是您正在使用Eclipse,而且我确信它以及其他IDE可以轻松找到类中某些元素的所有用法。