deprecated

我偶尔会遇到一种情况,我需要引入新的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

deprecated

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

  1. 使用Java的@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. deprecated_@Deprecated新外观可能是什么?

    deprecated JDK增强建议 (JEP)277(" 增强的弃用 ")建议"重新定义弃用注释,并提供加强功能生命周期尾端的工具." 当前@ java.la ...

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

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

  9. Java @Deprecated注解

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

最新文章

  1. 如何在PHP中保护数据库密码?
  2. 图书馆管理系统用户端心得
  3. 防止页面的重复提交,刷新
  4. jquery 弹出遮罩层
  5. mysql删除员工_MySQL误删数据救命指南:开发人员必收藏
  6. ExpandRegion for Sublime Text:快速选择文本
  7. java购物车 数据库_网上购物车数据库设计(转)
  8. 简单记录fastDFS安装
  9. 自动驾驶的Pipline -- 如何打造自动驾驶的数据闭环?(上)
  10. VisionTransformer(一)—— Embedding Patched与Word embedding及其实现
  11. 面向对象与面向过程编程的区别
  12. HTML 文本格式化
  13. 构建Linux Shell [第四部分]
  14. 如何查看计算机管理员用户名和密码,Administrator密码怎么找回教程
  15. 利用TC进行流量控制
  16. 亚马逊补单是怎么做的?
  17. k8s v1.17 新特性预告: 拓扑感知服务路由
  18. nyist oj nyoj 865
  19. 跨境电商亚马逊这个行业还能赚钱吗,行业未来在哪里?
  20. 阿里云市场StoneDB购买与部署指南

热门文章

  1. YBTOJ洛谷P4331:数字序列(左偏树)
  2. P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】
  3. jzoj3913-艰难的选择【差分,统计】
  4. nssl1196-摘果子【树形依赖背包,dp】
  5. jzoj4273-圣章-精灵使的魔法语【线段树】
  6. ssl1197-质数和分解【dp练习】
  7. P3224 [HNOI2012]永无乡(并查集+权值线段树合并/平衡树)
  8. 【贪心】雷达装置(ybtoj 贪心-1-2)
  9. 编译原理(二)之语法分析
  10. 一文搞懂 Java 线程中断