deprecated_使用Java的@Deprecated前瞻

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fusionsphere的核心组件_FusionSphere架构详解

FusionSphere架构详解关键字:云计算XEN Hypervisor FusionSphere摘要:本技术案例主要针对Huawei FusionSphere云计算软件架构进行深入分析,总结概括出我们的FusionSphere云计算产品技术及课程内容中的关键点,为产品技术学习和云计…

将py文件打包成exe可执行文件

使用pyinstaller库即可将py文件打包成exe文件 安装pyinstaller库 pip install pyinstaller将py文件打包成exe文件 1.首先进入cmd,用cd命令定位到要打包的py文件所在的文件夹 2.使用以下命令打包py文件 pyintaller -F xxx.py #xxx.py就是要打包的文件之后会生成…

文件的 MD5 签名介绍

在 RFC1321 中有 MD5 的详细描述。简单的说,MD5 根据文件的内容用算法产生一个唯一的128位签名,用任何方法改变文件都会导致签名改变。尽管人们一直在讨论修改文件后能保持签名不变的理论可能性,但截止到目前还没有人能够做到。所以在文件使用…

apache.camel_Apache Camel 2.21发布–新增功能

apache.camel我们刚刚发布了Apache Camel 2.21,我将在此博客中重点介绍值得注意的更改。 此版本不支持Spring Boot2。对Spring Boot 2的支持将在Camel 2.22中提供, 我们计划在2018年夏季之前发布。 1)处理大型JMS消息 我们在JMS组件中添加了…

人生永无止境的意思是什么_励志人生:生活不会给任何脆弱鼓掌。

每一日你所付出的代价都比前一日高,因为你的生命又消短了一天,所以每一日你都要更积极。今天太宝贵,不应该为酸苦的忧虑和辛涩的悔恨所销蚀,抬起下巴,抓住今天,它不再回来。一个人失败的最大原因&#xff0…

精通 RPM 之校验篇_检验篇_检测篇

文章目录一、校验介绍二、参考示例(一)校验某个已安装的软件包的所有文件(一)校验系统中所有已安装的软件包(二)校验含有指定文件的软件包(三)校验指定类别的软件包(四&a…

python关于路径需使用的方法笔记

关于python中有关路径实现代码的方法常用的python方法join()方法split()方法关于文件路径\ / // \\的用法解释斜杠/反斜杠\读取某个路径的文件双斜杠//双反斜杠\\\os.path库的方法连接路径与路径或文件名获取绝对路径获取当前文件的绝对路径返回文件名字返回文件所在文件夹的路…

不同的Hibernate命名策略

本文讨论了hibernate提供的不同命名策略,以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的转变。最后,我们将研究一下在Hibernate和配置中实施自…

设置按峰值带宽计费_西部数码使用指南:云服务器计费模式说明

版权归西部数码所有,原文链接:https://www.west.cn/faq/list.asp?unid2370一、付费模式1、包年包月先付费后使用模式,资源固定,按年或者按月付费购买可享受较大的价格优惠,帮您更大程度节省支出,并且时间固…

信号处理基本概念

信号处理 信号是传递信息的函数,也是独立变量的函数,这个变量可以是时间空间位置等。如图像的灰度值等就是空间位置的函数,声压随着时间在变化,就是时间的函数。 连续信号就是在某个时间区间,除有限间断点外所有瞬时…

如何理解计算机程序中的宏?

计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。 宏…

过滤器过滤特定的url_如何从过滤器中排除URL

过滤器过滤特定的url默认情况下,过滤器不支持排除特定的URL模式,每当您为过滤器定义URL模式时,任何与该模式匹配的请求都将由过滤器无例外处理。 从过滤器中排除URL的最简单方法是将过滤器映射到非常特定的模式。 在早期开发阶段完成此操作是…

计算机网络视频笔记

计算机网络计算机网络和互联网计算机网络(简称网络)internet(互连网)网络的组成网路边缘网络核心应用层传输层(运输层)网络层:数据链路层和局域网物理层网络安全无线和移动网络多媒体网络网络管理计算机网络和互联网 计算机网络(简称网络) 由若干结点和连接这些结…

一个dsp最小系统至少要有_DSP最小系统电路设计

DSP最小系统电路设计第1章绪论DSP有两种涵义,一种是Digital Signal Processing,指的是数字信号处理技术;一种是DigitalSignalProcessor,指的是数字信号处理器。两者是不可分割的,前者是理论上的技术,要通过…

g++默认字符集utf-8_Java可能使用UTF-8作为其默认字符集

g默认字符集utf-8由于基于Java的应用程序通常用于各种各样的操作系统和环境中,因此Java开发人员会遇到与基于字符的输入和输出有关的问题并不少见。 涉及这些问题的博客文章包括《警察的恐怖:默认语言环境,默认字符集和默认时区》 &#xff1…

Linux 的权限表达式

文章目录一、采用权限字母和操作符表达式(一)授权对象(二)权限字母符号二、采用权限数字表达式(一)权限数字(二)权限组合(三)命令 chmod 后面的数字含义一、采…

nat 网卡间数据包转发_nat端口转发示例

nat端口转发示例环境:A服务器: 网卡1:192.168.1.151 网卡2:10.10.69.10B服务器: 网卡1:10.10.69.41要求:访问192.168.1.151:1521 即访问 10.10.69.41:1521启用端口转发:echo 1 > /proc/sys/net/ipv4/ip_forward清空…

精通 RPM 之查询篇

文章目录一、命令格式二、选项详解(一)查询所有已安装的软件包(二)查询有哪些软件包属于指定的类别(三)查询有哪些软件包拥有指定文件(四)查询有哪些包需要指定功能(五&a…

如何判断2服务器性能好或坏_无服务器革命:好,坏和丑

如何判断2服务器性能好或坏“这是愚蠢的。 比愚蠢还糟:这是一场营销炒作。” ‐ 理查德斯托曼 ( Richard Stallman)对云计算的评论,2008年9月 而且,十年后,当有人提到这个词时,您开始三思而后…

datax 持续数据同步_采用DataX实现多表增量数据同步

这两天验证了一下阿里的DataX数据同步工具,觉得DataX可以用来做管理数据的多级数据同步。DataX用来做批量数据迁移很适合,能够保证数据的一致性,性能也很好,结合时间戳字段,用来实现数据定时增量同步也是可以的&#x…