自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

模塊化解惑:JSR 294、可視性與可用性的概念澄清

原創(chuàng)
開發(fā) 后端
與Java模塊化相關(guān)的標(biāo)準(zhǔn),比較成熟的是OSGi(JSR 291),還有與Java自身的模塊化密切相關(guān)的JSR 294,而這個(gè)JSR往往和Jigsaw項(xiàng)目掛鉤。但是,JSR 294事實(shí)上并不是模塊化系統(tǒng)。一位就職于IBM的OSGi CTO曾在文中介紹過可視性和可用性這兩個(gè)模塊化概念之異同,澄清了這一概念。

【51CTO精選譯文】JSR 294經(jīng)常被描述為模塊化系統(tǒng),但這是錯(cuò)誤的。事實(shí)上,JSR 294提供的是一系列語言和虛擬機(jī)的特性,這些特性對(duì)OSGi和Jigsaw這些模塊化系統(tǒng)有好處——就好像JSR 292提供的虛擬機(jī)特性對(duì)JRuby和Jython這些動(dòng)態(tài)語言運(yùn)行時(shí)有好處一樣(參考閱讀:JVM動(dòng)態(tài)語言支持詳解。這是Java 7當(dāng)中加入的一個(gè)重要新功能。感興趣的讀者可以瀏覽51CTO的Java 7專題)。JSR 292標(biāo)準(zhǔn)化的是鏈接協(xié)議,而非鏈接行為;JSR 294標(biāo)準(zhǔn)化的是模塊的可用性(accessibility),而非模塊的界限。

就職于IBM的OSGi CTO,BJ Hargrave曾在2009年三月撰文一篇,介紹了模塊化的兩個(gè)重要概念:可視性(visibility)和可用性(accessibility)的不同。以下為全文:

可視性指的是一個(gè)類型是否能看到另一個(gè)類型。在JLS(Java Language Specification,Java語言規(guī)范)當(dāng)中,這個(gè)概念被當(dāng)作可觀察性(observability)被討論。在JVMS(Java Virtual Machine Specification,Java虛擬機(jī)規(guī)范)當(dāng)中,這個(gè)概念與類加載相關(guān)?;旧?,這個(gè)概念描述出來就是:T類型對(duì)于S類型而言是否是可視的。在編譯時(shí),這個(gè)概念指編譯器在編譯S類型的時(shí)候能否為類型T定位。在運(yùn)行時(shí),這個(gè)概念指S類型的類加載器能否加載(直接的或通過委托的)T類型。一個(gè)類型也可以通過反射建立可視性。即使S類型的類加載器無法加載T類型,S類型仍然可以在反射時(shí)接觸到T類型。比如說,一個(gè)對(duì)象是S類型通過I類接口直接引用的,但它仍然可能是T類型的對(duì)象。

可用性指的是一個(gè)類型能否使用(access)另一個(gè)類型,或另一個(gè)類型的成員。這在JLS和JVMS當(dāng)中都進(jìn)行過探討。很多人通過public,protected和private關(guān)鍵字了解到可用性這個(gè)概念。

可視性和可用性的概念有重合,但他們是兩個(gè)不同的概念;并且在我們實(shí)現(xiàn)Java模塊化的時(shí)候,這兩個(gè)概念必須要分開理解。首先,要使用一個(gè)類型,這個(gè)類型必須是可視的。然后才牽扯到這個(gè)類型或這個(gè)類型相關(guān)聯(lián)的成員是否可用的問題。一個(gè)類型可以同時(shí)是可視的而不可用的。

OSGi通過嚴(yán)格限制可視性實(shí)現(xiàn)模塊化。這很有道理,因?yàn)镺SGi建立在類加載器(ClassLoader)模型之上。所以,如果bundle A導(dǎo)入了bundle B導(dǎo)出的包(packages),那么bundle B當(dāng)中的其他所有包對(duì)于bundle A的類加載器而言都是不可視的。但是,如果bundle B注冊(cè)了一個(gè)服務(wù),而實(shí)現(xiàn)這個(gè)服務(wù)的類型對(duì)于bundle A的類加載器而言是不可視的,bundle A仍然能夠得到這個(gè)服務(wù)的類對(duì)象(通過service.getClass())。即使那個(gè)類當(dāng)中包含服務(wù)接口之外的公共方法(public methods),bundle A仍然可以呼叫這些方法。

#t#往Java當(dāng)中添加一個(gè)module可用性關(guān)鍵字的意義在于,當(dāng)一個(gè)類型嘗試透過模塊之間的界限使用另一個(gè)類型時(shí),我們可以讓虛擬機(jī)強(qiáng)制對(duì)可用性進(jìn)行控制。比如說,在上述例子當(dāng)中,如果bundle A和B分屬不同的模塊(按照J(rèn)SR 294的定義),那么bundle A將不能使用bundle B的服務(wù)實(shí)施類的模塊可用性成員。這樣一來,bundle的編寫者就擁有了更多控制和封裝的能力。

困難在于模塊之間界限的定義。這有關(guān)虛擬機(jī)是否強(qiáng)制控制可用性,而JSR 294工作組當(dāng)中對(duì)這一塊仍然在不停地討論。相關(guān)問題還有是否讓Java編譯器自身理解模塊界限來進(jìn)行可視性的處理,以及新的模塊可用性關(guān)鍵字。javac目前有一個(gè)簡化的可視性視圖:-classpath/-sourcepath。這和OSGi這樣的模塊化系統(tǒng)當(dāng)中的嚴(yán)格的可視性完全不是一個(gè)等級(jí)的。讓Java編譯器擁有可視性,從而更好的滿足運(yùn)行時(shí)的需求,這是個(gè)主要的挑戰(zhàn)。

【51CTO.com譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com。】

原文:The Programming Delusion: I am Visible but am I Accessible? 作者:BJ Hargrave

責(zé)任編輯:yangsai 來源: 51CTO.com
相關(guān)推薦

2012-06-07 09:49:28

廣域網(wǎng)WAN

2009-12-10 11:04:08

Java模塊化OSGiJigsaw

2024-08-13 15:42:19

2012-09-04 09:18:02

NPBBYOD

2011-03-29 16:37:59

備份安全性可用性

2021-06-06 22:39:48

網(wǎng)絡(luò)安全監(jiān)控網(wǎng)絡(luò)攻擊

2020-04-18 20:21:16

網(wǎng)絡(luò)安全可視性安全工具

2012-09-07 09:57:14

2011-02-17 08:49:49

WebHTMLCSS

2012-02-13 23:20:18

linux集群高可用

2020-11-09 13:56:52

可視性與監(jiān)控

2013-11-22 09:06:47

應(yīng)用可視性應(yīng)用控制無線

2018-05-03 09:36:19

多云環(huán)境云計(jì)算可視

2019-07-30 10:16:41

云計(jì)算IT混合云

2024-02-27 09:48:25

Redis集群數(shù)據(jù)庫

2017-08-24 17:05:06

2017-12-04 10:51:06

VMwareAWS

2018-10-17 09:01:25

數(shù)據(jù)中心網(wǎng)絡(luò)可視性

2012-07-04 11:21:07

OpenStack

2009-04-16 15:34:35

SQL Server
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)