Java中的新关键字9

Wil*_*ood 36 java syntax java-platform-module-system java-9

Java 9最大的功能之一将是Project Jigsaw定义的模块系统.在阅读Project Jigsaw:在 JavaOne 2015 的Hood下阅读幻灯片时,我注意到以下源代码:

// src/java.sql/module-info.java
module java.sql {
   exports java.sql;
   exports javax.sql;
   exports javax.transaction.xa;
}
Run Code Online (Sandbox Code Playgroud)

这里有趣的是文件结尾.java并且似乎使用了两个新的关键字:module,和exports.Java 9中将引入哪些其他关键字?如何处理向后兼容性(即命名的函数或变量module)?

Mar*_*old 64

为Java 9中的模块声明添加的关键字在Java语言规范,Java SE 9 Edition的 §3.9中进行了总结:

进一步的十个字符的序列被限制关键字:open, module,requires,transitive,exports,opens,to,uses, provides,和with.这些字符序列仅被标记为关键字,它们在ModuleDeclaration和ModuleDirective制作中作为终端出现(第7.7节).它们在其他地方被标记为标识符,以便与Java SE 9之前编写的程序兼容.有一个例外:在ModuleDirective生产中,字符序列的右侧需要将字符序列传递标记为关键字,除非它是后跟一个分隔符,在这种情况下,它被标记为一个标识符.

如果您目前有一个名为的方法module,或此处列出的任何其他关键字,它将继续编译.

(view并且permits是早期Jigsaw原型中的关键字,但很久以前它们就被简化了.)


Wil*_*ill 5

这可能不是一个完整的清单,根据我的知识,这些都没有最终确定,但我发现了一些.

我们也有module,exports,provides,uses,with,to,和requires; 在这里解释:

模块系统可以通过扫描模块工件中的类文件来识别ServiceLoader :: load方法的调用来识别服务的使用,但这既慢又不可靠.模块使用特定服务是该模块定义的一个基本方面,因此为了效率和清晰度,我们在模块的声明中用uses子句表示:

module java.sql {
    requires public java.logging;
    requires public java.xml;
    exports java.sql;
    exports javax.sql;
    exports javax.transaction.xa;
    uses java.sql.Driver;
}
Run Code Online (Sandbox Code Playgroud)

模块系统可以通过扫描META-INF /服务资源条目的模块工件来识别服务提供者,就像ServiceLoader类今天所做的那样.但是,模块提供特定服务的实现同样是基础,因此我们在模块的声明中用provide子句表示:

module com.mysql.jdbc {
    requires java.sql;
    requires org.slf4j;
    exports com.mysql.jdbc;
    provides java.sql.Driver with com.mysql.jdbc.Driver;
}
Run Code Online (Sandbox Code Playgroud)

...

module java.base {
    ...
    exports sun.reflect to
        java.corba,
        java.logging,
        java.sql,
        java.sql.rowset,
        jdk.scripting.nashorn;
}
Run Code Online (Sandbox Code Playgroud)

viewpermits:

在大型软件系统中,定义同一模块的多个视图通常很有用.一个视图可以被声明为任何其他模块的一般用途,而另一个视图提供对内部接口的访问,这些内部接口仅供选择的一组密切相关的模块使用.

例如,对于JNDI,我们希望com.sun.jndi.toolkit.url仅对cosnaming和kerberos模块可见,如模块声明中所指定.

view jdk.jndi.internal {
    exports com.sun.jndi.toolkit.url.*;
    exports sun.net.dns.*;
    permits jdk.cosnaming;
    permits jdk.kerberos;
Run Code Online (Sandbox Code Playgroud)

}

这样我们就可以更灵活地定义模块边界.

我也听说过optional.