@Deprecated对方法参数和局部变量意味着什么?

问题描述 投票:10回答:3

免责声明:我知道@Deprecated的含义和目的。

@Deprecated批注的定义在Java源代码中看起来像这样:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

我了解具有CONSTRUCTORFIELDTYPEMETHODPACKAGE的目标值的目的。

但是,将方法参数或局部变量标记为@Deprecated是什么意思?

奇怪的是,下面的示例编译时没有任何警告。

interface Doable {
    void doIt(@Deprecated Object input);
}

class Action implements Doable {

    @Override
    public void doIt(@Deprecated Object input) {

        String string = String.valueOf(input); // no warning!

        @Deprecated
        String localVariable = "hello";

        System.out.println("Am I using a deprecated variable?" + localVariable); // no warning!
    }
}

这是他们将来可能打算实施的东西吗?


FWIW,我在Ubuntu 12.04 64bit上使用JDK 1.7.0_11。无论是从Eclipse还是从命令行运行程序,结果都是相同的。

编译器确实对使用@Deprecatednormal发出警告,例如使用java.util.Date类的一个不推荐使用的构造函数。只是为了证明我没有错误的端子或设置,这是输出:

$ javac com/adarshr/Test.java -Xlint:deprecation
com/adarshr/Test.java:12: warning: [deprecation] Date(int,int,int) in Date has been deprecated
        new Date(2013, 1, 31);
        ^
1 warning
$ 
$ javac -version
javac 1.7.0_11
java deprecated
3个回答
7
投票

将方法参数或局部变量标记为@Deprecated是什么意思?

它有the same meaning as when applied to any other element:

带注释的程序元素@Deprecated是不鼓励程序员使用的元素,通常是因为这样做很危险,或者因为存在更好的替代方法。当在不推荐使用的代码中使用或覆盖不推荐使用的程序元素时,编译器会发出警告。


在Java 7中,编译器为什么不省略不推荐使用的参数和字段的警告?Because that's exactly what the JLS (§ 9.6.3.6) dictates.

除非使用:声明,类型,方法,字段或构造函数的声明使用注释@Deprecated进行注释(即,按名称覆盖,调用或引用),否则Java编译器必须产生弃用警告,除非:

  • 用途是在本身带有@Deprecated注释的实体内;或

  • 此用法在带有注释的实体中,以用注释@SuppressWarnings("deprecation")禁止显示警告;或

  • 用法和声明都在同一个最外层的类中。

在局部变量声明或参数声明上使用@Deprecated批注无效。

(添加了重点)


2
投票

JLS明确声明@Deprecation注释在局部变量上被忽略。参见Matt Ball的答案。

这是他们将来可能打算实施的东西吗?

我非常怀疑。

  • 这是什么意思……除了其当前含义,它是对实现者的非正式提醒(可能还包括样式检查器/ PMD / FindBugs等),需要删除局部变量。

  • 任何material更改可能会破坏当前使用上述注释的人员的源兼容性。 Java维护人员尽力避免破坏旧代码。


0
投票

如果编译这样的代码(例如:mvn clean编译),则会收到以下警告消息

@Deprecated annotation has no effect on this variable declaration

表示其无用:)

© www.soinside.com 2019 - 2024. All rights reserved.