【Java】剖析@Deprecated注解
Before Java9
注解@Deprecated可以标记Java API状态,表示API已过时和不被推荐使用。
标记原因可以是以下几种:
- 使用它存在某些风险,可能导致错误
- 一个更好和更高效的方案可以取代它
- 在未来版本中可能对其无法兼容地进行更改,或者在将来的版本中将其删除
使用被 @Deprecated 标记的 API 会被编译器警告,或者被IDE的语法检查做黄色的警告。
在Java9之前,有一些早期的设计不是很好的API由于已被广泛使用,不得不保留下去。顶多是有的API被标记为@Deprecated而不被推荐使用,其实没有强硬删除的意味。因为一旦真的删除某些API,可能会使得使用这些API的程序不兼容或者出现Bug,会带来很多麻烦事。但这一切都会被Java9颠覆。
而且在Java9之前,@Deprecated都是没有元素的,但Java9为我们增加了两个元素。
Since Java9
Java9为注解增加了两个新元素:since 和 forRemoval。
- since: 元素指定已注解的API元素已被弃用的版本。
- forRemoval: 元素表示注解的 API 元素在将来的版本中被删除,应该迁移 API。
也就是说,对于被标记为@Deprecated的元素,不迁移该API的使用,可能在JDK版本升级后是不行的。
由于Java9引入了模块化,所以需要对模块这部分的@Deprecated做一个说明:
一个被标记@Deprecated的模块不会影响其中的部分,使用的那些部分如果没有@Deprecated修饰,就不会被编译器警告。
使用说明
- 强烈建议在文档中使用@Deprecated的javadoc标记说明不赞成使用程序元素的原因。 该文档还应该建议并链接到建议的替代API(如果适用)。
替代API的语义通常会有所不同,因此也应讨论此类问题,给用户一个明确的说明。 - 建议为所有新注释的程序元素都提供一个since值。
这不是强制性的,只是建议。毕竟许多现有的注释都缺少此元素值(过去大多是Java8,而变化就是在Java8到Java9的路上开始的)。 - 注释元素之间没有定义的顺序。 按照惯用写法并参照定义样式,先写since后写forRemoval会比较好。
- 如果存在@Deprecated 的javadoc标记,则@Deprecated注释应始终存在,反之亦然。
源码(注释说明已删)
package java.lang;import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;/*** @author Neal Gafter* @since 1.5* @jls 9.6.4.6 @Deprecated*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {/*** @return the version string* @since 9*/String since() default "";/*** @return whether the element is subject to removal* @since 9*/boolean forRemoval() default false;
}
实战练习
用记事本写一下代码——DeprecatedTest.java
class Person {private int id;private String name;@Deprecated(since="1.1")Person(){}Person(int id, String name) {this.id = id;this.name = name;}@Deprecated(since="1.1")public void setId(int id) {this.id = id;}public int getId() {return this.id;}@Deprecated(since="1.1")public void setName(String name) {this.name = name;}public String getName() {return this.name;}}public class DeprecatedTest {public static void main(String[] args) {Person p1 = new Person();p1.setId(1);p1.setName("Sam");Person p2 = new Person(2, "Bob");}
}
编译的时候会爆警告的:
获取一下详细信息,果然是调用我们标记@Deprecated的API的部分:
【Java】剖析@Deprecated注解相关推荐
- Java中的注解以及应用 @Deprecated @SupressWarning @Override
Annotation注解在Java中有着很广泛的 ,他是做为一种标识 为javac所识别 ,.每一个注解 都对应这一个 Java类 在java.lang包中 有三个注解 分别是 Deprecate ...
- Java中的注解以及应用 @Deprecated @SupressWarning @Override
Annotation注解在 Java 中有着很广泛的,他是做为一种标识 为javac所识别,.每一个注解 都对应这一个Java类 在java.lang包中 有三个注解 分别是 Deprecated ...
- Java基础 系统注解 @Override @Deprecated @SuppressWarnings 使用的方法及原因
Java 系统注解 为什么用?: 好处:使用系统定义的注解,可以在编译时对程序进行检查. 注解用在包.类.字段.方法.局部变量.方法参数等的前面,对这些元素进行说明和注释. @Override @Ov ...
- Java @Deprecated注解
Java 中 @Deprecated 可以用来注解类.接口.成员方法和成员变量等,用于表示某个元素(类.方法等)已过时.当其他程序使用已过时的元素时,编译器将会给出警告. 使用 @Deprecated ...
- java注释和注解_注释注解JAVA注解
发一下牢骚和主题无关: package anno; import java.lang.annotation.Retention; import java.lang.annotation.Retenti ...
- 详解Java中的注解
在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行. 注解可以做什么 Java中的注 ...
- 1.3 @Deprecated注解
Java 中 @Deprecated 可以用来注解类.接口.成员方法和成员变量等,用于表示某个元素(类.方法等)已过时.当其他程序使用已过时的元素时,编译器将会给出警告. 使用 @Deprecated ...
- [转] Java @interface 自定义注解
[From] http://blog.csdn.net/afterlife_qiye/article/details/53748973 1. 注解的好处 注解可以替代配置文件完成对某些功能的描述,减少 ...
- java annotation list_Java 注解 (Annotation)你可以这样学
注解语法 因为平常开发少见,相信有不少的人员会认为注解的地位不高.其实同 classs 和 interface 一样,注解也属于一种类型.它是在 Java SE 5.0 版本中开始引入的概念. 注解的 ...
最新文章
- mysql数据库解压安装教程_MySQL数据库之windows 10下解压版MySql安装配置方法教程...
- 收藏 | 图神经网络的解释性综述
- zset中的score_每天五分钟,成就redis大神之Zset数据类型
- 3、kubernetes应用快速入门190625
- 克莱门特公司在俄罗斯一个数据中心安装其新型冷却系统
- 《POSIX多线程程序设计》读书笔记
- 计算机上的usb设备是什么东西,联接一个USB的线在电脑桌上方便插U盘的东西叫什么?...
- 查询mysql 中的空文本_MySQL查询以显示空列的自定义文本
- python函数返回布尔值_python-3.x - 函数不返回正确的布尔值 - SO中文参考 - www.soinside.com...
- androidstudio做登录界面_Vue-cli+Element-ui实现后台管理系统(二)实现后台登录功能...
- oracle的rownum理解
- python3实现的rtsp客户端脚本
- EA(Enterprise Architecture,企业架构)
- 正则修饰符、用敏感词库替换
- 2017 CCPC 秦皇岛 G 题 ZOJ 3987 - Numbers (高精度+贪心)
- Android 一个String字符串 设置不同的颜色值
- qt html字体变红,QLineEdit、QLabel字体大小、颜色设置
- 硅谷开始玩中国玩剩下的了?
- 越专业的人,在下一个时代死得越惨烈!
- 数据预处理与特征工程—12.常见的数据预处理与特征工程手段总结
热门文章
- 详细的Windows下安装 binwalk
- 如何正确的通过 C++ Primer 学习 C++?(转自知乎)
- ZK tree使用mold
- 修改PHP上传文件的大小限制
- JavaScript大杂烩4 - 理解JavaScript对象的继承机制
- ASP.NET数据库访问系列教程01-概述篇 创建数据访问层(中)
- 究竟哪种取数据的方式最快?
- Hexo+GitHub 快速搭建个人博客(二)---- 域名解析
- 关于纯HTML格式写入word
- PHP-date(),time()函数的应用