@Deprecated对方法参数和局部变量的意义是什么?

时间:2013-01-31 13:49:11

标签: java deprecated

免责声明:我知道@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还是命令行运行程序,结果都是一样的。

编译器会针对@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

3 个答案:

答案 0 :(得分: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编译器必须生成弃用警告,除非:< / p>      

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

  •   
  • 该用途位于注释为使用注释@SuppressWarnings("deprecation")禁止警告的实体内;或

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

  •   
     

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

(强调补充)

答案 1 :(得分:2)

JLS明确指出局部变量会忽略@Deprecation注释。见Matt Ball的回答。

  

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

我非常怀疑。

  • 这意味着什么......除了当前的意义,作为对实现者(以及样式检查器/ PMD / FindBugs /等)的非正式提醒,需要删除本地变量。

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

答案 2 :(得分:0)

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

sealedSubclasses

表示其无用:)