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但是阻止從模塊“外部”進行訪問。 從某種意義上說,這介于現有的public和default公開性之間。 我們稱其為假設的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
總結
以上是生活随笔為你收集整理的sun.misc.Unsafe苦难告诉我们什么的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring aop实践_使用Sprin
- 下一篇: 微信里面的工资理财怎么终止?