我偶尔遇到一种情况,我需要引入新的API或构造以供其他人试用,但是我知道在使用某些API后,它可能会根据其他人的反馈而改变。 在这种情况下,我想以某种方式注释该构造,以警告其他开发人员此新添加的构造的暂定性。 在这些情况下,我考虑了几种选择。

  • 使用第三方注释,例如Guava的@Beta注释。
  • 开发自定义注释。
  • 仅使用注释/ Javadoc。
  • 将@Deprecated注释与Javadoc @deprecated标记一起使用。

第三方注释

Guava的@Beta注释的Javadoc文档指出:

表示在将来的发行版中,公共API(公共类,方法或字段)将遭受不兼容的更改,甚至被删除。 带有此注释的API不受其包含库所作的任何兼容性保证。 请注意,此批注的存在并不表示所讨论的API的质量或性能,仅表示它不是“冻结的” API。

@Beta用法的这种解释似乎意味着这非常适合于可能被删除的“新”结构。 我在博客文章“ 两个普遍有用的番石榴注释 ”中讨论了更多有关此注释的内容。

使用第三方库的批注时的其他注意事项是,第三方库必须包含在一个人的类路径中,并且在最流行的Java IDE中通常不存在即开即用的支持以指示对该构造的特殊处理带有注释的注释。

自定义注释

如果由于其他任何原因未将库与批注一起使用,则在编写自己的自定义批注相对简单时,仅为批注添加新的库依赖项似乎有点繁重。 之前,我已经写过有关编写自定义@Unfinished批注的文章,该帖子还讨论了如何在NetBeans 8.0.2和IntelliJ IDEA 14.0.3中为该自定义批注创建相应的自定义IDE检查。

以下代码清单提供了一个可用于此目的的自定义注释的示例。

@预览注释

package dustin.examples.annotations;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Preview
{/*** Anticipated release in which Preview status will no longer apply.** @return Anticipated release of feature*/String transition() default "";/*** Version in which this preview feature was introduced.** @return Release in which this preview feature was introduced.*/String since() default "";/*** Reasons this construct is considered "preview."** @return Reasons this construct is considered preview.*/String[] reasons() default {};
}

自定义注释在流行的Java IDE中缺少任何现成的支持。

仅评论

不一定需要使用注释,简单的注释(Javadoc或其他方式)可以解释特定的构造是初步的,可能会消失。 但是,就交流意图而言,注释在许多方面都比注释弱。 使用IDE或其他工具解析注释比处理注释要困难得多。

@Deprecated批注和@deprecated Javadoc标记

可以使用@Deprecated对具有标准注释的IDE,工具和脚本可以轻松处理的不赞成使用的结构进行注释。 不幸的是, @Deprecated注释从未得到我希望得到的全部支持,因为我希望它能更具体地说明为什么在决定让JDK 9增强@Deprecated变得不那么雄心勃勃时不赞成使用某些东西。 Javadoc @deprecated标记可用于记录弃用实际上是针对可能会消失但也不会消失的“新”构造的。 如果决定保留“预览”结构,则可以删除@Deprecated批注和@deprecated Javadoc标记。

尽管@Deprecated批注和@deprecated Javadoc标记从包括内置IDE支持和大多数Java开发人员意识的标准中受益,但使用这些标记来标记可能会消失的新结构仍然有些不合适。可能会黏附。 文档“ 如何以及何时不推荐使用API ”的“ 何时不推荐使用 ”部分指出:“在设计API时,请仔细考虑它是否会取代旧的API。” 它进一步列出了弃用的三个原因,即“不安全,有错误或效率低下”,“在将来的版本中消失”和“鼓励不良的编码习惯”。

我并不是唯一认为“弃用”标记可能会被删除或不应使用的内容的人。 NicolasFränkel概述了Java中的功能生命周期,并解释说Java中的弃用是“对每个人的大胆而明确的声明,至少在当前形式下,功能版本没有未来。”

Alex Buckley在jdk-dev邮件列表消息“ JEP 12:处理支持预览功能的标准API ”中写道:

我们想使用“弃用弃用”作为标记“此API与预览功能紧密相连”的方式。 如果预览功能成为永久功能,则将删除弃用项。 从终端弃用到不弃用的转变是新颖的,但并不疯狂-弃用具有多种含义,并且其在JDK中的历史用法对于任何事情都不是很好的指南。

Buckley还引用了JEP 277 (“增强的弃用”)中有关弃用机制的使用的一段内容(我强调了Buckley强调的相同部分):

弃用是一种用于传达有关API生命周期的信息的技术:鼓励应用程序从API迁移过来,阻止应用程序对API形成新的依赖关系,并告知开发人员继续依赖API的风险

JDK 9引入的 “增强型” @Deprecated注释可以通过其新添加的“ since ”和“ forRemoval ”元素在这种情况下有所帮助(Buckley称之为“出生时弃用弃用”)。 指定@Deprecated注释的forRemoval()false ,并指定其since为同一版本的Javadoc @since标记可以帮助开发者看到,构造从一开始弃用目前尚无计划将其删除。 为了使这种方法最有效,可能会写成将forRemoval明确声明为false,而不是依赖于其隐式默认值。

可能我们的Java开发人员将需要开始考虑@Deprecated@deprecated与过去有所不同。 尽管@Deprecated批注和@deprecated Javadoc标记仍“通知”我们对已注释/描述的结构的“持续依赖的风险”,但认为这样的结构将来必定会消失是不正确的。 如果我们在已弃用的JDK构造中习惯了这种替代含义,那么我们将更有可能考虑将相同的方法与我们自己新近添加但仍具有试验性的功能一起使用。

翻译自: https://www.javacodegeeks.com/2018/03/forward-looking-with-javas-deprecated.html

使用Java的@Deprecated前瞻相关推荐

  1. deprecated_使用Java的@Deprecated前瞻

    deprecated 我偶尔会遇到一种情况,我需要引入新的API或构造以供其他人试用,但是我知道在使用某些API后,它可能会根据其他人的反馈而改变. 在这种情况下,我想以某种方式注释该构造,以警告其他 ...

  2. 如何正确地使用Java的@deprecated标注

    没有什么事情比看到一个没有任何说明的@deprecated标注更让人愤怒的事情了.这种做法只能让人困惑,我到底还要不要用这个已经'废弃'的方法?如果开发者不希望某个方法再被人用的话,就要好好地为@de ...

  3. Java中@Deprecated作用、使用以及引用

    一.作用 在Java中凡是使用@Deprecated标志的类,都是不鼓励使用的类,如果使用或者进行重写,程序会发出警告. 二.场景 一般的话,使用这个注释都是该类不再使用,比如说设计类的时候,之前类存 ...

  4. java的面相,【NB】Java面相对象前瞻之内存分配

    数组如何进行常用操作 我们所涉及到数组的常用操作,无非是增加数组元素.删除数组元素.修改数组元素.查询数组元素这几种,我们先介绍数组如何进行查询. 查询说白了就是如何获取数组中的操作,首先是获取数组中 ...

  5. Java 新特性前瞻:封印类

    本文要点: 1.即将于 2020 年 9 月发布的 Java SE 15 将引入"封印类(sealed class)"(JEP 360),并将其作为预览特性. 2.封印类是一种类或 ...

  6. 乐视直播api编写java,GitHub - czp3009/bilibili-live-api: bilibili 直播弹幕协议 API Java 版(deprecated)...

    Deprecated 本仓库已废弃. 本项目使用 Bilibili Web 协议, 随着 Bilibili 前端的更新, 已经无法正常使用. 本项目仅提供 Bilibili 直播间的弹幕获取有关 AP ...

  7. jAvA中deprecate,在Java中使用Deprecated方法或类是错误的吗?

    1.在Java中使用Deprecated方法或类是错误的吗? 从已弃用的定义 : 注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者是因为存在更好的selec ...

  8. Java @Deprecated注解

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

  9. Java注释@interface的用法

    2019独角兽企业重金招聘Python工程师标准>>> java用  @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类. @O ...

最新文章

  1. 操纵BGP AS-PATH 属性案例(配图+详细验证过程)
  2. flask使用debug模式时,存在错误时,会占用设备内存直至服务重启才释放;debug模式会开启一个守护进程(daemon process)...
  3. 虚拟化--027 VMware vCenter Server Heartbeat 6.5安装教程
  4. list clear 2 python,python中怎么将列表的数据清空
  5. java8 list 行转列_太赞了,Intellij IDEA 竟然把 Java8 的数据流问题这么完美的解决掉了!
  6. 杭电计算机14年笔试真题
  7. Failed to start The nginx HTTP and reverse proxy server.
  8. java简单代码练习
  9. Jeesit下面form:select的二级联动
  10. Java远程连接数据库——远程连接MySQL数据库,操作和管理MySQL数据库
  11. WIN11 系统取消代理 | 设置代理服务器
  12. 你不知道的电脑36个小技巧(纪念2011教师节)
  13. miui12是Android版本,miui12基于安卓几版本开发的?miui12是安卓11吗[多图]
  14. 常用的十种算法:二分查找,分治,动态规划,KMP
  15. GPS跟踪载波环matlab代码,GPS接收机载波跟踪环路解决方案
  16. 无驱、代码自动植入:新一代软件保护锁——圣天诺LDK-HL
  17. 2019.04.20【NOIP提高组】模拟 B 组 观察题目+堆(?)+最大匹配+贪心、DP
  18. obs windows 编译 obs browser
  19. 自动驾驶自主避障概况
  20. 今天收到了WinZip发来的免费License

热门文章

  1. 面试官:为什么 Spring Boot 的 jar 可以直接运行
  2. 零基础写Java知乎爬虫之进阶篇
  3. 你可能不知道的 10 条 SQL 技巧
  4. 几天没写代码,就……
  5. vue父子组件生命周期顺序_vue父子组件生命周期执行顺序
  6. springboot:BeanPostProcessor示例及分析
  7. 把本地库推送到github远程库
  8. think-in-java(9)接口
  9. Redis高可用:主从复制及哨兵模式
  10. 单列集合Set的实现类HashSet