使用Java的@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

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

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

相关文章

计算机组成原理setb,计算机组成原理与汇编语言4

第四章指令系统指令系统概述指令系统是指某一种计算机所有指令的集合。对计算机而言,这是一组二进制数的输入,实际上是一组电平的输入。这些输入能在一个指令周期内产生人们预先规定的动作。显然这不是一组随机的二进制数据输入。指令系统是联系硬件和软…

计算机通信系统分哪两类,通信系统的组成(数字通信系统由哪几部分组成)

基本系统一般由信源(始发设备)、信宿(接收设备)和信道(传输介质)方式来自源的信息(语言、字符、图像或数据)由终端设备(如电话、电传打字机、传真机或数据终端设备等)转换成电信号。)在发送方,然后由始发设备编码、调制、放大或发送,然后基带信号被转换成…

nosql非关系型数据库_从Datomic出发,革命性的非NoSQL数据库

nosql非关系型数据库我终于设法了解了当今最不寻常的数据库之一,Datomic,并希望与您分享。 感谢Stuart Halloway和他的工作室! 为什么?!? 我们很快就会看到,Datomic与传统的RDBMS数据库以及各种…

你活在一个计算机模拟中吗,一麻省理工教授认为,我们更有可能生活在计算机模拟宇宙中...

一位麻省理工学院的教授表示,我们“更有可能”生活在某种模拟宇宙中,因为我们自己离能够创造超现实的模拟也不远了。(参见在接受解释性网站Vox采访时,计算机科学家Rizwan Virk认为,如果我们生活在信息世界而不是物质世界中&#x…

尽早查看针对Java 11的功能

随着JDK 10即将进入其发布候选阶段 ,有趣的是,开始通过JDK 11观察之后会发生什么。 在撰写本文时,四个JEP ( JDK增强建议 )已正式成为JDK 11的目标(可能会出现)。 这篇文章总结了当前针对JDK 11…

如何在命令行情重启计算机,如何应对“命令式”行情

如果说十月维稳行情,是以劝说,号召并佐以缓发新股为主要行政手段,那么十一月行情的主要特征就是“命令式”的。实践证明,十月行情并不咋地,虎头蛇尾,说明主力并不十分听话,也不卖力,…

服务器系统开机提示0xc000007b,0xc000007b蓝屏解决方法

0xc000007b是一种常见的蓝屏代码,导致出现此蓝屏代码的原因有很多,BIOS设置问题,驱动问题,硬件问题等等。硬件问题对于我们小白来说解决起来有点困难。我给大家带来了解决0xc000007b蓝屏软件问题的方法,赶紧来瞧瞧吧0x…

tms tck_记录合规性–关于TCK,规格和测试

tms tck使用软件规格非常困难。 不论在哪个地方提出; 您最终遇到了一个大问题:是否已实现所有指定的内容并对其进行了测试? 在瀑布驱动的方法学时代,这一直是一个问题,即使在撰写本文的今天,敏捷性和用户故…

3D环动画css3实现,CSS3 3D酷炫立方体变换动画的实现

我爱撸码,撸码使我感到快乐!大家好,我是Counter,本章微博主要利用了CSS3的一些新特性,主要用到关键帧来使3D图形运动起来,涉及到了一些抽象的思想,立体的想象。先给大家看看完成的效果&#xff…

Spring项目的按层打包已过时

我认为Spring应用程序不应该以逐层方法构建。 在我看来,按功能打包更有意义。 首先,让我简要描述每种方法。 “按层打包”(在非Java世界中为“按类型折叠”) 该项目结构根据源代码文件所属的体系结构层将它们分为包/目录&#x…

css怎么控制两个字母,css英文字母数字自动换行且不断词方法

本文章来给各位同学介绍css怎样让英文字母数字自动换行且不断词方法总结,有需要了解的同学可进入参考。当一个定义了宽度的块状元素中填充的全部为纯英文或者纯数字的时候,在IE和FF中都会撑大容器,不会自动换行并且当数字或者英文中带有汉字时…

nmap 查看服务器版本信息,nmap命令-nmap命令扫描服务器信息的格式

用这条命令就可以扫描出目标网络的操作系统和开放端口号nmap-O...0/24上面的扫描信息直接输出到终端,如果想把结果写到文件里,可以用-oN,-oX选项输出到文本文件或xml文件。nmap-O...0/24-oXnmap_info.xml,结果会输出到XML文件&…

java构造函数内部调用_具有内部类构造函数参数的Java Reflection奇数

java构造函数内部调用关于Java内部类 Java允许成员类(在其他类内定义的类),局部类(在语句块内定义的类)和匿名类(无名称的类): class Outer {Object anonymous new Object(){}; //…

Java的新视差控件(JavaFX)

介绍 视差是一种视觉效果,您可以组合以不同速度移动的两个分层图像以获得深度感。 想想一下,当您在道路上行驶时,您会看到附近的树木在快速移动,而距离较远的树木将沿相同的方向移动,但速度较慢,结果是您感…

ajax提交file空指针,excel导入上传文件报空指针错误

页面入口全选导入导出${msg[globals.button.delete.more]}导出jsfunction excelImport() {top.layer.open({type: 1,area: [500, 300],title:"导入数据",content:$("#importBox").html() ,btn: [下载模板,确定, 关闭],btn1: function(index, layero){windo…

mockito 静态方法_Mockito –带有注释和静态方法的额外接口

mockito 静态方法在代码中,我最近遇到了一段非常糟糕的代码,该代码基于对对象执行某些操作的类转换。 当然,代码需要重构,但是如果您首先没有对该功能进行单元测试,则有时您可能无法做到/或者不想这样做(这…

手机推送信息到本地服务器,服务器信息推送到手机

服务器信息推送到手机 内容精选换一换服务器的计费方式为“包年/包月”,如果在计费周期内不想再继续使用,请参考本节指导进行退订。执行退订操作前,请确保待退订的服务器数据已完成备份或者迁移,退订完成后资源将被完全删除&#…

怎么修改服务器上的cpt文件,DELL-服务器-RAID-配置详解(28页)-原创力文档

DELL 服务器 RAID 配置详解磁盘阵列可以在安装系统之前或之后产生,系统会视之为一个(大型)硬盘,而它具有容 错及冗余的功能。磁盘阵列不单只可以加入一个现成的系统,它更可以支持容量扩展,方 法也很简单,只需要加入一个…

Apache Camel 2.21发布–新增功能

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

linux下网站服务器,Linux下使用Apache搭建Web网站服务器(示例代码)

[[email protected] ~]# yum install elinks –y主配置文件[[email protected] ~]# ls/etc/httpd/conf/httpd.conf/etc/httpd/conf/httpd.conf#我们又是怎么知道httpd的注配置文件是在你那里的呢?查看httpd注配置文件位置[[email protected] ~]# rpm -pql/mnt/Packa…