聞こえないJavaエンジニアが適当に書き連ねていく

つらつらとメモしたり日頃の溜まっている想いを吐き出す場所です。

Java9のモジュール化について考えてみた #java9

これは何か

モジュール化のメリットがよくわからなかったので、実際に手を動かしながら考えてみた。

seasar2時代から発展していない時代遅れの脳だと、以下の構成がしっくり来た。

モジュールの分け方

actionModule、formModule、serviceModuleの3つに分けてみる。

  • actionModuleはformModuleとserviceModuleを参照できる。
  • formModuleはactionModuleからしか参照できない。
  • serviceModuleはactionModuleから参照できない。

これで、xxxFormをうっかり(わざと?)serviceModule内で参照することを防ぐことができる。

または、formModuleでの入力チェックを行うために、serviceModuleを呼び出してしまうという事故も防げる。

お互いのモジュールの役割分担が出来るので、役割が分かりやすくなるかもしれない。

クラスパスの制御でもそれ出来るんじゃん?

今までは確かにクラスパスに追加する/しないでコントロールできたが、モジュール作成者の意図に沿ったものとは限らなかった。

今回、module-info.javaに依存関係を明記できるようになったことで、モジュール作成者の意図が伝えやすくなる。

思考をまとめてた時のソース

aaaActionModule

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 aaaActionModule {
    requires aaaFormModule;
    requires aaaServiceModule;
}

aaaFormModule

package form.project;

public class Form {

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name;

}
module aaaFormModule {
    exports form.project to aaaActionModule;
}

aaaServiceModule

package service.project;

public class Bean {

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name;

}
module aaaServiceModule {
    exports service.project to aaaActionModule;
}

参考にしたサイト

qiita.com

d.hatena.ne.jp