Java 9至12的新功能(第二集)《Modules》

我這回會說一下Java 9的Modules,它屬於架構性的功能(Architecture-level features):

Java 9 Modules是什麽,跟Python package又有什麼關係?

Java Modules就是好像Python的packages,其最主要的功能就是export跟import一些其他modules板塊的inter-dependencies,下圖就是一個簡單Java Modules的例子,你會看到有於package “org.codefx.demo.jpms”外面會附上一個”module-info.java” –> 這檔案是於Java 8或之前是沒有的:

而”module-info.java”就是這樣寫的:

module org.codefx.demo.jpms_hello_world {
    // this module only needs types from the base module 'java.base';
    // because every Java module needs 'java.base', it is not necessary
    // to explicitly require it - I do it nonetheless for demo purposes
    requires java.base;
    // this export makes little sense for the application,
    // but once again, I do this for demo purposes
    exports org.codefx.demo.jpms;
}

這就跟Python裡面Packages的__init__.py檔案很相似:

__init__.py就是這樣:

 # __init__.py
from .foo import foo_func
from .bar import bar_func
from .baz import baz_func

Java 9 Modules好處

那為什麼我們要用Modules呢,而Java 9 Modules又有什麼好處呢?

  • Java Development Kit (JDK)所存的一切dependencies太多了,未必所有的小型裝置都需要JDK的一切dependencies。尤其是Java 8新增了不少功能如Stream API,default methods in interfaces,令JDK都變大了
  • Modules增加了package的encapsulation。於Java 8或以前你的一個public method就可以讓所有packages存取你的class,但Java 9的Modules就可以讓你調整你個別package的能見度visibility。
  • 鞏固了Single Responsibility Principle(SRP)。在軟件設計的SOLID principles內,SRP是非常重要的環節 – 你現在看到JDK 8附帶的Stream interface已經有很多不同的method,非常多line of code,可以算是God class,我們就是要採用SRP去避免建造God class。

Java 9 Modules壞處

筆者好奇的是,我還是沒有看過網上對Java 9 Modules有什麼負評的,我則可以想到幾個壞處:

  • Missing classes or interfaces
    • Java 9 Modules的最大不好處就是要經常想有什麼dependencies需要import跟export,但Java 8就不用想需要那個dependencies;很多時候用IntelliJ或eclipse的auto-import功能就可以解決dependencies的問題了。 😂
  • Version mismatch between different JAR files
    • 如果你的package跟module用Java 9,但你又想採用別人用Java 12建設的 package跟module ,這有機會導致你跟他的 package跟module產生互相不兼容問題。

Java 9 模塊Modules例子:JDK 9內設的java.base

JDK9提供的模塊的例子就是java.base,當中會export java.lang.annotation(為了TestNG跟JUnit的unit testing)和java.lang.reflect(為了Java的Reflection功能)跟java.io(為了read/write from disk)

java –describe-module

你也可以在Windows的command prompt或Linux的terminal內輸入–describe-module看看該module是requires什麼,export什麼。

但注意要先define Java $PATH或%PATH%才能夠在command prompt或terminal執行java –describe-module java.sql

 $ java --describe-module java.sql
> java.sql@9
> exports java.sql
> exports javax.sql
> exports javax.transaction.xa
> requires java.logging transitive
> requires java.base mandated
> requires java.xml transitive> uses java.sql.Driver

Java 9 Modules的其他關鍵詞

我們暫時只探討了requires和exports這兩個關鍵詞,其實Java 9 Modules還有其他的關鍵詞:

exports, module, open, opens, provides, requires, uses, with

下一篇持續…

Leave a Reply

Your email address will not be published. Required fields are marked *