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

4
使用Eclipse,我希望在任何一个我使用的方法被标记为@Deprecated时立即看到警告。如果是这样,方法调用会被正确地划掉,但是如果方法来自同一类,则Eclipse不会发出警告。请参见下面的屏幕截图。
为了更好地复制,我也会提供文本形式的代码:
/* 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() 会生成警告。为什么?该怎样解决?
  • 启用项目特定设置 已被禁用
  • Window->Preferences->Java->Compiler->Errors/Warnings->Deprecated and restricted API 全部设置为 Warning,如上图所示。

注意: Eclipse not showing deprecated warning? 与此无关

1个回答

4
@Deprecated注释的确切定义不在javadoc中,而是在Java语言规范第9.6.4.6节中。本质上,它说使用已弃用元素将生成警告,除非使用和声明都在同一个最外层类中。因为MainClass.foo()MemberClass.foo()都在MainClass中,并且你对它们的调用也在MainClass中,所以不会生成警告。对OtherClass.foo()的调用不在同一个最外层类中,因此会生成警告。我认为这个规则的原因是,在最外层或顶级类中的代码可以被认为是一起维护和演变的。使元素过时通常是向“外部”代码发出的信号,可能由其他人维护,表示该元素即将发生某些事情。通常在类内部适用不同的规则。内部使用过时的元素(如私有元素)可能是完全可以的。编译器或IDE发出JLS所需的附加警告,例如在同一个最外层类中使用已弃用元素的警告,可能是合法的。虽然我不知道有任何系统这样做。但是你正在使用Eclipse,我相信它以及其他IDE可以轻松地找到类中某个元素的所有用法。

谢谢您详细易懂的回答!那么您的建议是忍受它还是绕过去呢? - phil294
@Blauhirn 是的,基本上就是忍耐它。或者如果你想在同一文件中快速查找所有已弃用元素的使用情况,在定义点更改其拼写,并查找所有红色波浪线即可。 :-) - Stuart Marks
@Blauhirn DeprecatedжіЁи§Јзҡ„иЎҢдёәжҳҜз”ұJLS规е®ҡзҡ„пјҢеҸҜиғҪе·Із»ҸеөҢе…ҘеҲ°зј–иҜ‘еҷЁдёӯгҖӮжҲ‘и®ӨдёәдҪ ж— жі•ж”№еҸҳе®ғгҖӮжҲ‘и§үеҫ—жҲ‘们дёҚеӨӘеҸҜиғҪж”№еҸҳJLSпјӣиҝҷдјјд№Һ并дёҚйҮҚиҰҒпјҢиҖҢдё”е®ғзҡ„ж–№ејҸжңүзӣёеҪ“еҘҪзҡ„зҗҶз”ұгҖӮ - Stuart Marks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接