| NavigateLanguage Fundamentals topic:() |
Since Java 9, one can usemodules to better encapsulate code. TheJava Platform Module System (JPMS) is used to specify distribution of a collection of packages.
A module be used to specify a collection of packages belonging to the public API of a Java program. This is primarily useful for a library, which may contain classes intended for internal use.
The module declaration is placed in a file namedmodule-info.java at the root of the module’s source-file hierarchy. The JDK will verify dependencies and interactions between modules both at compile-time and runtime.
For example, the following module declaration declares that the modulecom.foo.bar depends on anothercom.foo.baz module, and exports the following packages:com.foo.bar.alpha andcom.foo.bar.beta:
module com.foo.bar {requires com.foo.baz;exports com.foo.bar.alpha;exports com.foo.bar.beta;}Java modules use the following keywords:
exports: used in a module declaration to specify which packages are available to other modulesmodule: declares a moduleopen: indicates that all classes in a package are accessible via reflection by other modulesopens: used to open a specific package for reflection to other modulesprovides: used to declare that a module provides an implementation of a service interfacerequires: used in a module declaration to specify that the module depends on another moduleto: used with theopens directive to specify which module is allowed to reflectively access the packagetransitive: used with therequires directive to indicate that a module not only requires another module but also makes that module's dependencies available to modules that depend on ituses: used in a module to declare that the module is using a service (i.e. it will consume a service provided by other modules)with: used with theprovides directive to specify which implementation of a service is provided by the moduleAs of Java 25, modules can themselves be imported, automatically importing all exported packages. This is done usingimport module. For example,importmodulejava.sql; is equivalent to
importjava.sql.*;importjavax.sql.*;// Remaining indirect exports from java.logging, java.transaction.xa, and java.xml
Similarly,importmodulejava.base;, similarly, imports all 54 packages belonging tojava.base.
importmodulejava.base;/** * Importing module java.base allows us to avoid manually importing most classes * The following classes (outside of java.lang) are used: * - java.text.MessageFormat * - java.util.Date * - java.util.List * - java.util.concurrent.ThreadLocalRandom */publicclassExample{publicstaticvoidmain(String[]args){List<String>colours=List.of("Red","Orange","Yellow","Green","Blue","Indigo","Violet");IO.println(MessageFormat.format("My favourite colour is {0} and today is {1,date,long}",colours.get(ThreadLocalRandom.current().nextInt(colours.size())),newDate()));}}