Java9のモジュール化について考えてみた #java9
これは何か
モジュール化のメリットがよくわからなかったので、実際に手を動かしながら考えてみた。
seasar2時代から発展していない時代遅れの脳だと、以下の構成がしっくり来た。
モジュールの分け方
actionModule、formModule、serviceModuleの3つに分けてみる。
- actionModuleはformModuleとserviceModuleを参照できる。
- formModuleはactionModuleからしか参照できない。
- serviceModuleはactionModuleから参照できない。
これで、xxxFormをうっかり(わざと?)serviceModule内で参照することを防ぐことができる。
または、formModuleでの入力チェックを行うために、serviceModuleを呼び出してしまうという事故も防げる。
お互いのモジュールの役割分担が出来るので、役割が分かりやすくなるかもしれない。
クラスパスの制御でもそれ出来るんじゃん?
今までは確かにクラスパスに追加する/しないでコントロールできたが、モジュール作成者の意図に沿ったものとは限らなかった。
今回、module-info.javaに依存関係を明記できるようになったことで、モジュール作成者の意図が伝えやすくなる。
思考をまとめてた時のソース
aaaActionModule
- Action.java
package action.project; import form.project.Form; import service.project.Bean; import service.project.Service; public class Action { public static void main(String... args) { Form form = new Form(); form.setName("aaa"); Bean bean = new Bean(); bean.setName(form.getName()); Service service = new Service(); service.execute(bean); } }
- module-info.java
module aaaActionModule { requires aaaFormModule; requires aaaServiceModule; }
aaaFormModule
- Form.java
package form.project; public class Form { public String getName() { return name; } public void setName(String name) { this.name = name; } private String name; }
- module-info.java
module aaaFormModule { exports form.project to aaaActionModule; }
aaaServiceModule
- Bean.java
package service.project; public class Bean { public String getName() { return name; } public void setName(String name) { this.name = name; } private String name; }
- module-info.java
module aaaServiceModule { exports service.project to aaaActionModule; }