jep使用

维护API很难。

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

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

更好的弃用

Stuart Marks又名Dr Deprecator

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

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

  • 不确定的 。 该API已被弃用,没有给出任何理由。 这是默认值; 今天隐含弃用的所有内容都有一个不合格的弃用原因。
  • 谴责 。 该API已指定在将来的JDK版本中删除。 请注意,此处使用的“已谴责”一词是指要拆除的结构。 该术语并不意味着暗示任何道德谴责。
  • 危险的 。 使用此API可能导致数据丢失,死锁,安全漏洞,错误结果或JVM完整性丢失。
  • 过时的 。 不再需要此API,应删除用法。 不存在替代API。 请注意,OBSOLETE API可能标记为“已拒绝”。
  • 放弃 。 该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

jep使用

jep使用_JEP 277“增强弃用”非常好。 但这是一个更好的选择相关推荐

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

    维护API很难. 我们正在维护非常复杂的jOOQ API. 但是就语义版本而言,我们遵循相对宽松的规则 . 当您阅读Brian Goetz和其他人关于在JDK中保持向后兼容性的评论时,我只能对他们的工 ...

  2. jep使用_JEP 374:禁用和弃用偏向锁定

    jep使用 来自OpenJDK开发人员Patricio Chilano Mateo的一项新的Java增强提案(JEP) JEP 374要禁用和弃用偏向锁定. 它为XS的工作量和持续时间评分,使其成为今 ...

  3. 数据增强:数据有限时如何使用深度学习 ?

    转自:https://www.leiphone.com/news/201805/avOH5g1ZX3lAbmjp.html 这篇文章是对深度学习数据增强技术的全面回顾,具体到图像领域.这是<在有 ...

  4. Color.js增强你对颜色的控制

    往逝之因 不要低头,皇冠会掉...  可你又没有皇冠 Color.js 增强你对颜色的控制 阅读目录 轻松管理颜色--color.js库 使用color.js Accessor Methods 你该知 ...

  5. mysql8 s开头函数学习

    199.SCHEMA() 此函数是 DATABASE() 的同义词. 200.SEC_TO_TIME(seconds) 返回秒参数, 转换为小时.分钟和秒,作为 TIME 值.的范围 结果被限制为 T ...

  6. MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁

    浏览目录: 1.视图 2.触发器 3.存储过程 4.函数 5.事物 6.数据库锁 7.数据库备份 1.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视 ...

  7. Java210道常见的面试

    1.JDK 和 JRE 有什么区别? JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含 ...

  8. Java面试题,208道

    前言 最近有很多粉丝问我,有什么方法能够快速提升自己,通过阿里.腾讯.字节跳动.京东等互联网大厂的面试,我觉得短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家 ...

  9. Java 面试题大全(一篇足以,建议收藏)

    Java 面试题大全 1.JDK 和 JRE 有什么区别? 2.== 和 equals 的区别是什么? 3.final 在 java 中有什么作用? 4.java 中的 Math.round(-1.5 ...

最新文章

  1. 阿丘科技招聘|图像算法工程师
  2. jquery字体颜色_基于jquery实现的web版excel
  3. 陶哲轩实分析习题 12.1.3
  4. 进程死锁的危害、导致原因和解决方法
  5. 工作计划2017-01-03
  6. kettle组件-查询
  7. 活动回顾丨从技术创新到行业实践——泛娱乐社交产品专场
  8. Java怎么学?在学Java的过程中要注意些什么呢?
  9. eclipse mysql生成实体类_Eclipse实现数据库反向生成实体类(pojo)-------(插件安装和实现步骤的说明)...
  10. dbscan算法中 参数的意义_无监督机器学习中,最常见的聚类算法有哪些?
  11. 树莓派3代刷ubuntu mate在命令行下配置wifi不能连接的一个诡异的bug的解决
  12. 机器学习超级复习笔记
  13. 阿里研究院:解读互联网经济十大议题
  14. 商用平板 移动金融潜力巨大的应用平台
  15. php fpm过多,Linux下php-fpm进程过多导致内存耗尽问题解决
  16. 用友nc java下载_用友nc的java插件下载
  17. UnDistort Audio File(音频修复软件)官方正式版V1.0 | 音频修复软件哪个好用 | 专业修复音频的软件
  18. 为文件添加everyone权限
  19. 第二章(第四部分) 黑暗之王的分身
  20. discuz gbk php在utf8,Discuz!X2 utf8升级为Discuz!X2.5 GBK 完美解决方案

热门文章

  1. AT2371-[AGC013E]Placing Squares【矩阵乘法】
  2. CF388D-Fox and Perfect Sets【dp,线性基】
  3. 51nod1675-序列变换【莫比乌斯反演】
  4. P6122-[NEERC2016]Mole Tunnels【模拟费用流】
  5. P3527-[POI2011]MET-Meteors【整体二分,树状数组】
  6. P4139-上帝与集合的正确用法【欧拉定理】
  7. F. Paper Grading(Trie树+dfs序+二维数点)
  8. 4、mysql数据库的权限管理
  9. 阿里巴巴开源 Spring Cloud Alibaba,加码微服务生态建设
  10. 深入理解分布式系统中的缓存架构(上)