JEP 277“增强弃用”非常好。 但这是一个更好的选择

维护API很难。

我们正在维护非常复杂的jOOQ API。 但是就语义版本而言,我们遵循相对宽松的规则 。

当您阅读Brian Goetz和其他人关于在JDK中保持向后兼容性的评论时,我只能对他们的工作表示敬意。 显然,我们都希望最终移除VectorStackHashtable类的东西,但是在collection API周围存在与向后兼容相关的边缘情况,普通凡人不会想到。 例如: Java集合为什么不删除通用方法?

更好的弃用

Stuart Marks又名Dr Deprecator

Stuart Marks又名Dr Deprecator

使用Java 9,Jigsaw和模块化,这些新功能的主要驱动目标之一是能够“切断” JDK的各个部分,并在以后的发行版中轻轻地弃用并删除它们。 作为此改进的一部分, Stuart Marks AKA Deprecator博士建议了JEP 277:“增强的弃用” 。

这样做的目的是通过一些附加信息来增强@Deprecated批注,例如:

  • 不确定的 。 该API已被弃用,没有给出任何理由。 这是默认值; 今天隐含弃用的所有内容都有一个不赞成使用的弃用原因。
  • 谴责 。 该API已指定在将来的JDK版本中删除。 请注意,此处使用的“已谴责”一词在意欲拆除的结构的意义上使用。 该术语并不意味着暗示任何道德谴责。
  • 危险的 。 使用此API可能导致数据丢失,死锁,安全漏洞,错误结果或JVM完整性丢失。
  • 过时的 。 不再需要此API,应删除用法。 不存在替代API。 请注意,OBSOLETE API可能会或可能不会标记为CONDEMNED。
  • 放弃 。 该API已被较新的API取代,用法应从该API迁移到较新的API。 请注意,SUPERSEDED API可能会或可能不会被标记为CONDEMNED。
  • 已取消 。 调用无效或将无条件引发异常。
  • 实验 。 该API并不是规范的稳定部分,它可能会不兼容地更改或随时消失。

在弃用东西时,能够传达弃用的意图很重要。 也可以通过@deprecated Javadoc标记来实现,该标记可以生成任何类型的文本。

另一种更好的解决方案

上述主张存在以下问题:

  • 它是不可扩展的 。 对于JDK库设计人员来说,以上内容可能就足够了,但是作为第三方API提供程序的我们将希望枚举中包含更多元素,而不是CONDEMNED,DANGEROUS等。
  • 仍然没有纯文本信息 。 由于我们仍无法正式向注释提供任何可澄清的文本,例如为什么某事物“危险”的动机,因此该注释与Javadoc标记之间仍然存在冗余。
  • “不推荐使用”是错误的 。 将UNIMPLEMENTED或EXPERIMENTAL标记为“已弃用”的想法表明了该JEP的变通方法性质,它试图在现有名称中增加一些新功能。

我感到JEP太害怕触摸太多部分了。 但是,将有一个非常简单的替代方案,它对每个人都好得多:

public @interface Warning {String name() default "warning";String description() default "";
}

无需将可能的警告类型的数量限制为有限的常量列表。 相反,我们可以使用@Warning注释,该注释可以包含任何字符串!

当然,JDK可以具有一组众所周知的字符串值,例如:

public interface ResultSet {@Deprecated@Warning(name="OBSOLETE")InputStream getUnicodeStream(int columnIndex);}

要么…

public interface Collection<E> {@Warning(name="OPTIONAL")boolean remove(Object o);
}

注意,虽然实际上不赞成使用JDBC的ResultSet.getUnicodeStream() ,但我们也可以向Collection.remove()方法添加提示,该方法仅适用于Collection类型,而不适用于其许多子类型。

现在,使用这种方法的有趣之处在于,我们还可以增强有用的@SuppressWarnings批注,因为有时,我们只是知道KnowWhatWeAreDoing™,例如在编写类似以下内容时:

Collection<Integer> collection = new ArrayList<>();// Compiler!! Stop bitching
@SuppressWarnings("OPTIONAL")
boolean ok = collection.remove(1);

这种方法可以一次性解决许多问题:

  • JDK维护人员拥有他们想要的。 轻度弃用JDK的好工具
  • 关于 @SuppressWarnings可能发生的事情的记录不完整的混乱最终将变得更加干净和正式
  • 我们可以根据各种用例向用户发出大量自定义警告
  • 用户可以在非常细微的级别上使警告静音

例如: jOOQ的动机是消除DSL equal()方法与不幸的Object.equals()方法之间的歧义:

public interface Field<T> {/*** <code>this = value</code>.*/Condition equal(T value);/*** <strong>Watch out! This is * {@link Object#equals(Object)}, * not a jOOQ DSL feature!</strong>*/@Override@Warning(name = "ACCIDENTAL_EQUALS",description = "Did you mean Field.equal?")boolean equals(Object other);
}
  • 此处描述了该用例的背景: https : //github.com/jOOQ/jOOQ/issues/4763

结论

毫无疑问,JEP 277很有用。 但是它的范围也非常有限(可能不会进一步延迟Jigsaw吗?)但是,我希望JDK维护人员可以更彻底地处理生成此类编译器警告的主题。 这是DoTheRightThing™的绝佳机会

我认为上述“规范”并不完整。 这只是一个粗略的主意。 但是我曾希望作为API设计人员多次尝试这种机制。 为了向用户提供有关潜在的API滥用的提示,他们可以通过以下方式将其静音:

  • @SuppressWarnings ,直接在代码中。
  • 易于实现IDE设置。 对于Eclipse,NetBeans和IntelliJ来说,对这些东西实施自定义警告处理将非常简单。

一旦有了@Warning批注,我们也许可以最后淘汰不那么有用的@Deprecated

@Warning(name = "OBSOLETE")
public @interface Deprecated {
}

翻译自: https://www.javacodegeeks.com/2015/12/jep-277-enhanced-deprecation-nice-heres-much-better-alternative.html

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

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

相关文章

ds哈希查找—二次探测再散列_大白话之哈希表和哈希算法

哈希表概念哈希表&#xff08;散列表&#xff09;&#xff0c;是基于关键码值(Key value)而直接进行访问的数据结构。也就是说&#xff0c;它通过把关键码值映射到表中一个位置来访问记录&#xff0c;以加快查找的速度。这个映射函数叫做散列函数&#xff08;哈希函数&#xff…

QBC(Query By Criteria) QBE (Query By Example)

QBC 参考&#xff1a;(Hibernate的QBC查询) //is empty and is not emptyTestpublic void testQBC(){Session session sf.getCurrentSession();session.beginTransaction();//criterion 标准/准则/规范Criteria c session.createCriteria(Topic.class)//from Topic.add(Rest…

二叉搜索时与双向链表python_剑指Offer(二十六) 二叉搜索树和双向链表

题目描述输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点&#xff0c;只能调整树中结点指针的指向。思路以及解答主要是使用递归&#xff0c;设置一个head和end&#xff0c;head只在第一次设置值&#xff0c;后面就是将end的…

python数据分析神器_太香了!墙裂推荐6个Python数据分析神器!!

hello&#xff0c;大家好我是东哥&#xff01; 用Python处理数据大家都不陌生了&#xff0c;属常规操作&#xff0c;但常规之下还是也有些暗藏技巧的&#xff0c;本篇东哥分享6个好玩高效的操作&#xff0c;帮助大家提高效率。 一、Pandas Profiling Pandas Profiling提供数据的…

第五天敏捷冲刺

每日任务&#xff1a; 1.本次会议为第三次 Meeting会议&#xff1b; 2.由于本次会议人员都有各自的事情&#xff0c;所以都通过私聊组长来&#xff0c;讨论接下来的任务&#xff1b; 3.今天的代码部分coding:https://git.coding.net/ysh0904/wl2ban.git 4.燃尽图&#xff1a; 5…

jsf集成spring_Spring和JSF集成:分页

jsf集成spring使用大型数据集时&#xff0c;通常需要以分页格式显示数据。 分页是一个有趣的问题&#xff0c;因为它倾向于跨越应用程序的所有层&#xff0c;从视图层通过应用程序服务一直到对数据库的原始调用。 在获取分页数据时&#xff0c;有一些非常好的解决方案。 如果您…

mysql timestamp 并发_MySQL 实现 EF Code First TimeStamp/RowVersion 并发控制

在将项目迁移到MySQL 5.6.10数据库上时&#xff0c;遇到和迁移到PostgreSQL数据库相同的一个问题&#xff0c;就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现。先上网搜索解决方案&#xff0c;找到Ak.Ini的博文http://www.cnblogs.com/akini/arc…

python元组操作_Python:元组操作总结

Python的元组和列表类似&#xff0c;不同之处在于元组中的元素不能修改(因此元组又称为只读列表)&#xff0c;且元组使用小括号而列表使用中括号&#xff0c;如下: 1 tup1(physics,chemistry,1997,2000)2 tup2(1,2,3,4,5,6) 特别注意: 1、元组中只包含一个元素时&#xff0c;需…

Java函数式编程:Javaslang入门

Java是一门古老的语言&#xff0c;并且有很多新手在Java&#xff08;JVM&#xff09;领域挑战它们。 但是Java 8到来并带来了一些有趣的功能。 这些有趣的功能使编写新的惊人框架&#xff08;如Spark Web框架或Javaslang&#xff09;成为可能 。 在本文中&#xff0c;我们将介…

mysql语句表名大小写敏感_Mysql 表名大小写敏感

默认情况下&#xff0c;mysql在创建数据库对象时&#xff0c;是区分大小写的。故与microsoft之间进行移植时&#xff0c;要特别注意是否存在问题。在mysql中大小写与参数lower_case_table_names有很大关系。以下为官方解释&#xff1a;If set to 0, table names are stored as …

python json是什么_python json详解

在写某狗屁不通文章生成器的时候&#xff0c;发现有个json类型的文件看不懂。 于是先来搞懂什么是json json是一种储存数据的文件类型。 说人话&#xff0c;就是一种文件&#xff0c;能够数据 类似于DOC&#xff0c;excel 之类的。 json能储存半结构化数据。 简单来说&#xff…

mobx中跟新了数据视图没变化_【第1781期】MobX 简明教程

前言SEEConf&#xff0c;2020年1月4号杭州见&#xff0c;C位抢票见文章末尾。今日早读文章由腾讯whinc投稿分享。正文从这开始&#xff5e;&#xff5e;导读&#xff1a;MobX 是一个优秀的响应式状态管理库&#xff0c;在流行的状态管理库 Redux 之外为我们提供了其他选择。如果…

excel导航窗格_Excel小技巧16:在每天的某个时刻自动打开特定工作簿

学习Excel技术&#xff0c;关注微信公众号&#xff1a;excelperfect我想要在每天下班前&#xff0c;将自已一天的工作进行整理并简短记录在一个Excel工作簿中。然而&#xff0c;有时候忙&#xff0c;可能会忘记&#xff1b;有时候到下班时间了&#xff0c;急于下班&#xff0c;…

pdf secured_使您的Spring Security @Secured注释更干燥

pdf secured最近&#xff0c;Grails用户邮件列表中的一个用户想知道在定义Secured注释时如何减少重复 。 在Java批注中指定属性的规则非常严格&#xff0c;因此我看不到直接执行他所要求的方法的方法。 使用Groovy并没有真正的帮助&#xff0c;因为Groovy类中的注释大部分与Ja…

51单片机按键控制数码管0~9_51单片机外部中断

前面为大家介绍的点亮LED灯、数码管、按键只用到了51单片机的IO资源&#xff0c;我们要是仅仅用单片机点灯、操作数码管&#xff0c;那可真是大才小用了。这些都只是51单片机资源的冰山一角&#xff0c;51单片机还有好多的功能&#xff0c;我后面将为大家一一介绍。今天为大家介…

IIS7开启gZip动态压缩

1.安装动态压缩模块&#xff1a; 安装过程可能的报错&#xff1a;This application has requested the Runtime to terminate it in an unusual way. 解决办法>> 报错&#xff1a;错误: 尝试安装 动态内容压缩 失败&#xff0c;错误代码为 0x8007000E。 存储空间不足&am…

mysql查询不重复记录数_mysql查询不重复的行内容,不重复的记录数.count,distinct

有这么一个表 记录了id, p_id, p_name , p_content , p_time 1 343 aaa aaaaaa 2012-09-01 2 344 bbb bbbbbb 2012-09-02 3 321 ccc cccccccc 2012-09-03 4 343 aaa aaaaaa 2012-09-04 想查询不重复的行的内容,并且输出 p_sum ( 产品p_id出现重复的次数) sele有这么一个表记录了…

使用Java中的FileChannel和ByteBuffer在文件中读取/写入文件

过去&#xff0c;我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO&#xff0c;在本Java NIO教程中&#xff0c;我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据。 Channel提供了一种从文件读取数据的替代方法&#xff0c;它提供了比InputStream…

字符,字符串,int之间互相转换

字符转换成字符串&#xff1a;String str String.valueOf(ch); 字符转换成int&#xff1a; int a ch; 字符串转换成字符&#xff1a;char ch str.charAt(0); 字符串转换成Int&#xff1a;只包含数字的字符串可以通过Integer.parseInt(str)转换为int&#xff0c;但是包含字母…

mysql 导入百万级数据 几种 java_Java 修行第034天--执行计划及其使用--Oracle数据导入导出--第三章MySQL使用...

执行计划中牢记几句话:-- 尽量避免是*代替所有列,编写查询语句时使用具体列名代替*,可以防止全表扫描-- 尽可能少的使用like关键字进行模糊查询-- 建立适当的索引可以提高查询效率十三. 执行计划--通过PL/SQL Developer查看查询的1 执行计划是一条查询语句在Oracle中的执行过程…