Java @Deprecated对方法参数和局部变量意味着什么?
免责声明:我知道弃用的Java @Deprecated对方法参数和局部变量意味着什么?,java,deprecated,Java,Deprecated,免责声明:我知道弃用的@的含义和目的 @Deprecated注释的定义在Java源代码中如下所示: @已记录 @保留(RetentionPolicy.RUNTIME) @目标(值={构造函数、字段、局部变量、方法、包、参数、类型}) public@interface已弃用{ } 我理解拥有构造函数,字段,类型,方法和包的目标值的目的 但是,将方法参数或局部变量标记为已弃用的是什么意思 奇怪的是,下面的示例编译时没有任何警告 接口可行{ void doIt(@不推荐的对象输入); } 集体行动是
@的含义和目的
@Deprecated
注释的定义在Java源代码中如下所示:
@已记录
@保留(RetentionPolicy.RUNTIME)
@目标(值={构造函数、字段、局部变量、方法、包、参数、类型})
public@interface已弃用{
}
我理解拥有构造函数
,字段
,类型
,方法
和包
的目标值的目的
但是,将方法参数或局部变量标记为已弃用的是什么意思
奇怪的是,下面的示例编译时没有任何警告
接口可行{
void doIt(@不推荐的对象输入);
}
集体行动是可行的{
@凌驾
public void doIt(@Deprecated Object input){
String String=String.valueOf(输入);//无警告!
@不赞成
字符串localVariable=“hello”;
System.out.println(“我使用的是不推荐使用的变量吗?”+localVariable);//没有警告!
}
}
这是他们将来可能打算实施的吗
FWIW,我在Ubuntu 12.04 64位上使用JDK1.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
将方法参数或局部变量标记为已弃用的是什么意思
它有
注释为@Deprecated
的程序元素是不鼓励程序员使用的元素,通常是因为它很危险,或者存在更好的替代方案。编译器在未弃用的代码中使用或重写弃用的程序元素时发出警告
为什么编译器不忽略Java 7中不推荐使用的参数和字段的警告?
当使用类型、方法、字段或构造函数(其声明用注释@Deprecated
注释)时,Java编译器必须生成不推荐使用警告(即被名称覆盖、调用或引用),除非:
- 该用法在实体内,该实体本身使用注释@Deprecated进行注释;或
- 该用法位于一个实体内,该实体被注释为使用注释抑制警告
@SuppressWarnings(“弃用”)
;或
- use和declaration都在同一个最外层类中
在局部变量声明或参数声明中使用@Deprecated
注释无效。
(添加了强调)JLS明确声明在局部变量上忽略@Deprecation注释。见马特·鲍尔的答案
这是他们将来可能打算实施的吗
我非常怀疑
- 这意味着什么。。。除了它当前的含义,作为对实现者(可能还有样式检查器/PMD/FindBugs/etc)的非正式提醒,需要删除局部变量
- 任何实质性更改都可能破坏当前使用上述注释的用户的源代码兼容性。Java维护人员非常努力地避免破坏旧代码
如果编译这样的代码(例如:mvn clean compile),您将收到以下警告消息
@不推荐的注释对该变量声明没有影响
意思是它没用:)只是出于好奇,你用的是哪种编译器?当您编写//无警告
时,您是否在IDE中?我很难理解带有不推荐参数的非推荐方法的含义……您一定在Eclipse中看到了这一点;我也看到了。但是,当我使用javac编译时,我确实收到了一个警告。在Java 6中-不确定这是否有影响。@adarshr在JLS:)中找到了它。
在局部变量声明或参数声明中使用@Deprecated注释没有任何效果。
就是其中之一!它必须为将来保留:)@adarshr-除非你能想出一个不涉及发出警告的用途,否则我对此表示怀疑。Java维护人员不太可能强制进行语言更改,因为指定为忽略的构造将不再被忽略。它破坏了源代码级兼容性。