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注解相关推荐

  1. Java中的注解以及应用 @Deprecated @SupressWarning @Override

    Annotation注解在Java中有着很广泛的 ,他是做为一种标识 为javac所识别 ,.每一个注解 都对应这一个 Java类  在java.lang包中 有三个注解  分别是 Deprecate ...

  2. Java中的注解以及应用 @Deprecated @SupressWarning @Override

    Annotation注解在 Java 中有着很广泛的,他是做为一种标识 为javac所识别,.每一个注解 都对应这一个Java类  在java.lang包中 有三个注解  分别是 Deprecated ...

  3. Java基础 系统注解 @Override @Deprecated @SuppressWarnings 使用的方法及原因

    Java 系统注解 为什么用?: 好处:使用系统定义的注解,可以在编译时对程序进行检查. 注解用在包.类.字段.方法.局部变量.方法参数等的前面,对这些元素进行说明和注释. @Override @Ov ...

  4. Java @Deprecated注解

    Java 中 @Deprecated 可以用来注解类.接口.成员方法和成员变量等,用于表示某个元素(类.方法等)已过时.当其他程序使用已过时的元素时,编译器将会给出警告. 使用 @Deprecated ...

  5. java注释和注解_注释注解JAVA注解

    发一下牢骚和主题无关: package anno; import java.lang.annotation.Retention; import java.lang.annotation.Retenti ...

  6. 详解Java中的注解

    在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行. 注解可以做什么 Java中的注 ...

  7. 1.3 @Deprecated注解

    Java 中 @Deprecated 可以用来注解类.接口.成员方法和成员变量等,用于表示某个元素(类.方法等)已过时.当其他程序使用已过时的元素时,编译器将会给出警告. 使用 @Deprecated ...

  8. [转] Java @interface 自定义注解

    [From] http://blog.csdn.net/afterlife_qiye/article/details/53748973 1. 注解的好处 注解可以替代配置文件完成对某些功能的描述,减少 ...

  9. java annotation list_Java 注解 (Annotation)你可以这样学

    注解语法 因为平常开发少见,相信有不少的人员会认为注解的地位不高.其实同 classs 和 interface 一样,注解也属于一种类型.它是在 Java SE 5.0 版本中开始引入的概念. 注解的 ...

最新文章

  1. mysql数据库解压安装教程_MySQL数据库之windows 10下解压版MySql安装配置方法教程...
  2. 收藏 | 图神经网络的解释性综述
  3. zset中的score_每天五分钟,成就redis大神之Zset数据类型
  4. 3、kubernetes应用快速入门190625
  5. 克莱门特公司在俄罗斯一个数据中心安装其新型冷却系统
  6. 《POSIX多线程程序设计》读书笔记
  7. 计算机上的usb设备是什么东西,联接一个USB的线在电脑桌上方便插U盘的东西叫什么?...
  8. 查询mysql 中的空文本_MySQL查询以显示空列的自定义文本
  9. python函数返回布尔值_python-3.x - 函数不返回正确的布尔值 - SO中文参考 - www.soinside.com...
  10. androidstudio做登录界面_Vue-cli+Element-ui实现后台管理系统(二)实现后台登录功能...
  11. oracle的rownum理解
  12. python3实现的rtsp客户端脚本
  13. EA(Enterprise Architecture,企业架构)
  14. 正则修饰符、用敏感词库替换
  15. 2017 CCPC 秦皇岛 G 题 ZOJ 3987 - Numbers (高精度+贪心)
  16. Android 一个String字符串 设置不同的颜色值
  17. qt html字体变红,QLineEdit、QLabel字体大小、颜色设置
  18. 硅谷开始玩中国玩剩下的了?
  19. 越专业的人,在下一个时代死得越惨烈!
  20. 数据预处理与特征工程—12.常见的数据预处理与特征工程手段总结

热门文章

  1. 详细的Windows下安装 binwalk
  2. 如何正确的通过 C++ Primer 学习 C++?(转自知乎)
  3. ZK tree使用mold
  4. 修改PHP上传文件的大小限制
  5. JavaScript大杂烩4 - 理解JavaScript对象的继承机制
  6. ASP.NET数据库访问系列教程01-概述篇 创建数据访问层(中)
  7. 究竟哪种取数据的方式最快?
  8. Hexo+GitHub 快速搭建个人博客(二)---- 域名解析
  9. 关于纯HTML格式写入word
  10. PHP-date(),time()函数的应用