2013-01-31 47 views
10

免责声明:我知道@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 
+0

只是为了好奇心,你正在使用哪种编译器?而当你写'//无警告'时,你是否在IDE中? – ThanksForAllTheFish

+0

我很努力去理解一个不赞成的方法和一个不赞成的参数可能意味着什么...... – assylias

回答

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.

一个Java编译器必须产生一个警告弃用当类型,方法,字段或构造,其声明被注释与注释@Deprecated被使用(即重写时,调用,或通过名称来引用),除非:

  • 使用是其本身与注释@Deprecated注释的实体内;或

  • 该用法位于一个实体内,该实体被注释为禁止带注释的警告@SuppressWarnings("deprecation");或

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

的局部变量声明或参数声明中使用@Deprecated注解没有影响。

(强调)

+0

没错。但'当在方法参数或局部变量上使用'@ Deprecated'时,编译器会警告在不推荐使用的程序元素被使用或在不被弃用的代码中被覆盖时,绝不会发生! – adarshr

+1

您必须看到Eclipse内部;我也看到了。但是,当我用javac编译时,我确实收到警告。 –

+0

你确定,因为我没有。看我的编辑。 – adarshr

2

的JLS明确指出@Deprecation注释局部变量忽略。看到马特鲍尔的回答。

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

我非常怀疑它。

  • 什么,这可能意味着......除了其目前的含义非正式提醒实现者(也许风格检查/ PMD/FindBugs的/等)的局部变量需要被移除。

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

+0

+1向后合规的非常好的一点。 – adarshr

相关问题