2017-07-23 150 views
12

在Java 9的模塊聲明有2層結構:爲什麼不允許導出整個模塊?

exports com.foo; 

而且

opens com.foo; 

exports補助編譯時訪問,同時允許opens運行時訪問,如反射和資源。

opens擁有exports一個寬大處理,你可以定義整個模塊的開放,導致一樣明確地打開每包:

open module com.mod { 

但目前還沒有類似的結構

exported module com.mod { 

我問題:爲什麼會這樣;做出了什麼樣的決定,允許一次打開整個模塊,而不是出口?

回答

13

模塊的導出定義了它的API,這應該是有意設計的並保持穩定。 「導出的模塊」可能通過添加,刪除或重命名軟件包而輕易地和無意中更改其API,這會違背穩定性目標。 (這與爲什麼不存在像exports foo.bar.*這樣的「通配符導出」相同的原因)。

另一方面,打開的包並未真正定義模塊的API。當然,代碼可以依靠只能通過反射訪問的功能,但Java社區通常認爲反射在用於訪問內部時是一種「黑客」。它更廣泛(更有益)的用途是訪問工件以爲其提供服務(XML/JSON序列化,持久性,依賴注入...)。在這種情況下,反映在模塊上的代碼不依賴取決於,因此不會因移動東西而被破壞。因此沒有理由保持打開的軟件包穩定,這使開放模塊等免費軟件成爲可能。

相關問題