10

免责声明:我知道@Deprecated.

@DeprecatedJava 源码中注解的定义是这样的:

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

我理解目标值为CONSTRUCTORFIELDTYPEMETHOD的目的PACKAGE

但是,将方法参数或局部变量标记为 是什么意思@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 64 位上使用 JDK 1.7.0_11。无论我是从 Eclipse 还是命令行运行程序,结果都是一样的。

编译器确实会针对 的正常使用发出警告@Deprecated,例如使用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
4

3 回答 3

7

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

与应用于任何其他元素时具有相同的含义:

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


为什么编译器不忽略 Java 7 中不推荐使用的参数和字段的警告?
因为这正是 JLS(第 9.6.3.6 节)所规定的。

当一个类型、方法、字段或构造函数的声明被注解时,Java 编译器必须产生一个弃用警告@Deprecated(即被名称覆盖、调用或引用),除非:

  • 使用在一个实体内,该实体本身使用注释 @Deprecated 进行注释;或者

  • 使用在带有注释的实体内,以抑制带有注释的警告@SuppressWarnings("deprecation");或者

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

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

(重点补充)

于 2013-01-31T13:52:04.327 回答
2

JLS 明确声明 @Deprecation 注释在局部变量上被忽略。请参阅马特·鲍尔的回答。

这是他们可能打算在未来实施的事情吗?

我非常怀疑。

  • 这可能意味着什么......除了它作为非正式提醒实现者(可能还有样式检查器/PMD/FindBugs/等)需要删除局部变量的当前含义之外。

  • 任何重大更改都可能会破坏当前使用上述注释的人的源兼容性。Java 维护人员非常努力地避免破坏旧代码。

于 2013-01-31T14:33:04.410 回答
0

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

@Deprecated annotation has no effect on this variable declaration

意味着它没用:)

于 2019-10-30T07:01:45.803 回答