为什么不允许导出整个模块?
问题描述:
在Java 9的模块声明有2层结构:为什么不允许导出整个模块?
exports com.foo;
而且
opens com.foo;
凡exports
补助编译时访问,同时允许opens
运行时访问,如反射和资源。
opens
拥有exports
一个宽大处理,你可以定义整个模块的开放,导致一样明确地打开每包:
open module com.mod {
但目前还没有类似的结构
exported module com.mod {
我问题:为什么会这样;做出了什么样的决定,允许一次打开整个模块,而不是出口?
答
模块的导出定义了它的API,这应该是有意设计的并保持稳定。 “导出的模块”可能通过添加,删除或重命名软件包而轻易地和无意中更改其API,这会违背稳定性目标。 (这与为什么不存在像exports foo.bar.*
这样的“通配符导出”相同的原因)。
另一方面,打开的包并未真正定义模块的API。当然,代码可以依靠只能通过反射访问的功能,但Java社区通常认为反射在用于访问内部时是一种“黑客”。它更广泛(更有益)的用途是访问工件以为其提供服务(XML/JSON序列化,持久性,依赖注入...)。在这种情况下,反映在模块上的代码不依赖取决于,因此不会因移动东西而被破坏。因此没有理由保持打开的软件包稳定,这使开放模块等免费软件成为可能。