sun.misc.Unsafe苦难告诉我们什么

Oracle将删除Java 9中的内部sun.misc.Unsafe类 。 尽管大多数人可能对这种变化漠不关心,但其他一些人(主要是图书馆开发人员)并非如此。 博客圈中最近有几篇文章描绘了这种变化所暗含的含义:

  • Dripstat 删除了Java 9中的sun.misc.Unsafe –一场灾难
  • Lluis Martinez 删除sun.misc.Java 9中的Unsafe将破坏Spring,Hibernate
  • 露西·凯里 ( Lucy Carey )的意愿:移除.Unsafe触发Javapocalypse吗?
  • 拉斐尔温特豪德的理解sun.misc.Unsafe

维护公共API非常困难,尤其是当该API与JDK一样流行时。 根本没有(几乎)没有办法阻止人们用脚射击自己。 Oracle(和以前的Sun) 始终sun.*软件包声明为内部软件包,不要使用它们。 从名为“为什么开发人员不应编写调用'sun'软件包的程序”页面引用:

sun。*软件包不是受支持的公共接口的一部分。

不能保证直接调用sun。*软件包的Java程序可以在所有与Java兼容的平台上运行。 实际上,即使在同一平台上的将来版本中,也无法保证此类程序可以正常工作。

此免责声明只是许多类似免责声明和警告中的一种。 凡前进并采用Unsafe这样做......“ 不安全 “。

我们从中学到什么?

解决这一苦难的具体解决方案正在讨论中,并且仍在公开中。 一个好主意是删除Unsafe 之前提供正式的公共替换,以允许有问题的库的迁移路径。

但是,所有这些还有一个更重要的信息。 消息是:

当您只有一把锤子时,每个问题都像拇指一样

转换为这种情况:锤子是Unsafe并且考虑到锤子非常糟糕,但是唯一的选择是,库开发人员可能只是没有太多选择。 他们不是真正的罪魁祸首。 实际上,他们在世界上最稳定,向后兼容的软件环境(= Java)中赌博,他们的表现非常出色,超过了10年。 在类似情况下,您会做出其他选择吗? 或者,让我提出不同的要求。 当时押注AWT或Swing是更安全的选择吗?

如果某人可以以某种方式使用某些东西,那么无论他们将如何用脚射击自己,都会如此。 当前编写库/ API并真正阻止用户访问内部组件的唯一方法是将所有内容放在单个程序包中,并将所有程序包设为私有。 从一开始,这就是我们一直在jOOQ中所做的事情,因为我们知道jOOQ的内部结构非常微妙,并且随时可能变化。

有关此原理的更多详细信息,另请阅读:

  • 嵌套类型的前5个用例
  • 尝试使方法默认为最终方法(列表中的项目9)

但是,对于开发这些内部组件的人员来说,此解决方案具有严重的缺点。 这是一个几乎没有结构的软件包的地狱。 这使发展相当困难。

那么,哪种Java更好呢?

Java总是缺乏足够的可视性 :

  • public
  • protected
  • default (包专用)
  • private

应该有第五种可见性,其行为类似于public但是阻止从模块“外部”进行访问。 从某种意义上说,这介于现有的publicdefault公开性之间。 我们称其为假设的module可见性。

实际上,我们不仅应该能够在类或成员上声明这种可见性,而且还应该能够在高层管理模块的相互依赖性, 就像Ceylon语言允许我们做的那样 :

module org.hibernate "3.0.0.beta" {import ceylon.collection "1.0.0";import java.base "7";shared import java.jdbc "7";
}

这与OSGi的捆绑软件系统非常相似,在OSGi的捆绑软件系统中,可以导入/导出捆绑软件,尽管上述模块语法比配置OSGi简单得多。

复杂的模块系统将走得更远。 它不仅可以匹配OSGi的功能,还可以匹配Maven的功能。 由于可以基于Java语言模块声明依赖关系,因此我们可能不再需要基于XML的Maven描述符,因为它们可以从简单的模块语法(或Gradle或ant / ivy)生成。

有了所有这些,就可以将诸如sun.misc.Unsafe类的类声明为module -仅对少数JDK module可见-而不是整个世界。 我敢肯定,滥用反思来掌握这些内部因素的人数将减少50%。

结论

我确实希望在将来的Java中,可以将此Ceylon语言功能( 以及Fantom语言功能btw )合并到Java语言中。 可以在此博客文章中看到有关Java 9 / Jigsaw的模块化封装的完整概述: http : //blog.codefx.org/java/dev/features-project-jigsaw-java-9/#Encapsulation

在那之前,如果您是API设计人员,请务必知道所有免责声明均无效。 您的客户将使用和滥用您的内部API。 从您发布它们开始的第一天起,它们就成为您普通公共API的一部分。 这不是您用户的错。 事情就是这样的。

翻译自: https://www.javacodegeeks.com/2015/07/what-the-sun-misc-unsafe-misery-teaches-us.html

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

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

相关文章

2k16显示miui停止服务器,MIUI11停止内测,MIUI12真的来了,与小米MIX4同天发布,与ios13一样流畅丝滑...

原标题:MIUI11停止内测,MIUI12真的来了,与小米MIX4同天发布,与ios13一样流畅丝滑根据miui官方给出的最新公告,现在miui11最后一个开发版基本停止内测,并称“永远相信美好的事情即将发生”,可以确…

【APICloud系列|42】安卓应用和ios应用下载地址生成一个统一二维码的解决办法

前言:这个需要自己的应用已经上线到腾讯应用宝、APPStore. 目录 终极解决办法 原因如下 「微下载」操作指南 推荐两个生成链接的平台

设计之路:如何进行软件需求分析?

1、需求分析的重要性 软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。 通常,软件生存周期包括可行性分析与开发项计划、需求分析、设计(概要设计和详细设计)、编码、测试、维护等活动。 常用的三种软件生命周期&a…

如何学好初中计算机,初中生怎么学习方法好 十大方法告诉你

1、学会建目录。一本教科书大约有十章,每章几页,十几页以上,包含许多标题,每个标题包含许多副标题,每个副标题包含一些知识点。当你第一次阅读时,根据章节,提取标题和知识指出,写笔记…

wadl 生成java_在Spring MVC REST应用程序中自动生成WADL

wadl 生成java上一次我们学习了WADL的基础知识 。 语言本身并没有那么有趣,只写了一篇有关它的文章,但是本文的标题揭示了为什么我们需要这些知识。 JSR 311的许多实现:JAX-RS:RESTful Web服务的Java API提供了开箱即用的运行时WA…

使用js设置ul标签的显示或隐藏和超链接调用js文件的方法

<ul class"nav" id"rm" styledisplay:none> <li> <a href# onclickRepayment() >还款信息</a></li> </ul> document.getElementById("rm").style.display"none" 转载于:https://www.cnblogs.co…

安卓应用和ios应用下载地址生成一个统一二维码

前言&#xff1a;这个需要自己的应用已经上线到腾讯应用宝、APPStore.终极解决办法腾讯应用宝「微下载 」&#xff0c;是目前生成二合一APP推广二维码的最佳方式。原因如下1. 微信仅支持应用宝「微下载」&#xff0c;才能直接下载APP● 微信拥有11亿用户量&#xff0c;“扫一扫…

css居中悬浮,CSS悬浮居中

百分比&悬浮栏.box{width:90%;background-color:gray;border:0px solid #000;margin-left:-45%;/*margin数值相当于width数值的负一半*/font-size:16px;/*行高默认为*/position:fixed;top:0%;left:50%;/*left数值永远等于50%(想要居中的话)*/text-align:center;color:#fff;…

在Java SE中使用Hibernate Bean Validator

Bean Validation主页上指出&#xff1a;“ Bean Validation是Java规范&#xff0c;…在Java SE中运行&#xff0c;但集成在Java EE&#xff08;6和7&#xff09;中。” 这篇文章演示了如何在Java EE容器之外使用Java Bean验证参考实现&#xff08; Hibernate Validator &#x…

程序员应该如何才能买房?

前段时间对象问我应该在哪买房&#xff0c;我的意见是现在一个小的城市搞个刚需房&#xff0c;后面可以再换个一线的大房子&#xff0c;后来她的建议是在工作附近搞一套&#xff0c;这样不用一边工作一边还房贷。无奈只能咨询各位大咖。看完这个大佬的经历&#xff0c;发现好多…

css规则的样式构成,Css 基本的规则写法

样式表的写法&#xff1a;css的语法由一些标志构成&#xff0c;就是一个基本的样式表由选择器&#xff0c;属性和属性值构成。Css有标准的写法规则标准的css写法&#xff1a;h1 {Font-family:黑体;}h1:表示选择符Font-family:表示属性&#xff0c;这里的作用是定义字体"黑…

nginx 虚拟主机

环境:2台web服务器&#xff0c;1台nginx服务器&#xff0c;1台客户端 1、配置2台web服务器(关闭iptables&#xff0c;关闭selinux) yum -y install httpd service httpd start exho "192.168.1.10" > /var/www/html/index.html exho "192.168.1.100"…

小程序开发从0到1

公司最近也想做小程序&#xff0c;简单梳理了一下&#xff0c;希望能给新人带来一点启发。 话不多说&#xff0c;直接上干货。 不是码农也想开发的直接采用混合式开发的方案&#xff0c;查漏补缺&#xff0c;用模板肯定会有点生硬&#xff0c;想走的更远建议还是采用原生开发的…

王者荣耀服务器维护啥时候结束,王者荣耀维护几点结束今天?11月10日维护公告...

王者荣耀维护今天几点结束&#xff1f;今天王者荣耀要进行全服的维护了&#xff0c;到时候服务器会选择性的轮流更新&#xff0c;到时候会有玩家登不上游戏&#xff0c;这都是正常的。这次的维护时间非常短只有一个半小时&#xff0c;不过你运气好的话&#xff0c;你的区域会优…

apache.camel_Apache Camel 2.9发布–十大变化

apache.camel在2011年的最后一天&#xff0c;阿帕奇骆驼制品被成功地推到了Maven仓库中&#xff0c;距离香槟酒瓶破裂并进入2012年仅1.5个小时。 2.9版是创纪录的发行版&#xff0c;自5个月前发布2.8版以来&#xff0c;已解决了约500张JIRA票证。 以下是10个最明显的改进和新功…

配置mysql使其允许外部ip进行登录

这两天在做一个数据库的项目&#xff0c;用到了mysql&#xff0c;需要通过外部的ip远程访问mysql&#xff0c;发现默认的mysql是不允许远程访问的&#xff0c;需要做简单的配置。 如下&#xff1a; 1. 打开一个终端&#xff08;cmd&#xff09;输入 mysql -u用户名 -p密码 #&am…

javaScript入门基础说明

JavaScript 教程 JavaScript 是 Web 的编程语言。 所有现代的 HTML 页面都使用 JavaScript。 JavaScript 非常容易学&#xff0c;本教程将教你打开 JavaScript 的大门 浏览器中的 JavaScript 能做什么&#xff1f; 现代的 JavaScript 是一种“安全”语言。 它不提供对内存…

ActiveMQ作为Logstash的消息代理

扩展Logstash时&#xff0c;通常会添加一个消息代理&#xff0c;该消息代理用于在一个或多个Logstash节点处理传入消息之前临时缓冲传入的消息。 数据通过像Beaver这样的发运人推送到代理&#xff0c; Beaver读取日志文件并将每个事件发送到代理。 或者&#xff0c;应用程序可以…

mysql 索引- 笔记

索引 mysql最常用的索引结构是btree(O(log(n)))&#xff0c;但是总有一些情况下我们为了更好的性能希望能使用别的类型的索引。hash就是其中一种选择&#xff0c;例如我们在通过用户名检索用户id的时候&#xff0c;他们总是一对一的关系&#xff0c;用到的操作符只是而已&#…

在编译器中鼠标光标变成下横线的解决办法

适用于各种智能编译器&#xff0c;HB-X,VSCode,ST3,IDEA等。 问题&#xff1a; 按一下键盘上的&#xff0c;insert 键。