[Java]Jigsawモジュールシステム


Jigsawモジュールシステム


Java 9の最大の特徴は、Jigsawプロジェクトを使用してモジュールシステムを導入することです.
Jigsawプロジェクトの目標は:

  • モジュール化されたリポジトリと大規模なシステムにより、強力なアクセス制御を実現
    =>パッケージの緩い結合により保守性が向上
    =>モジュール間の不必要な不正な結合を防止し、モジュールの適切な使用を確保
    =>セキュリティの向上

  • パフォーマンスの最適化:Javaプラットフォームモジュールシステム(JPMS)の一部としてJREは小さいモジュールに分類される.これにより、アプリケーションで実際に使用されているモジュールのみをパッケージングおよび導入できます.
  • アプリケーションは必要ありませんが、XML、SQL、Swingなどのパッケージは常に一緒に
  • を導入しています.
  • JPMSがJVM起動時にモジュール間の参照をチェックする
  • =>必要なモジュールを配置する傾向があります.小型コンピュータやラスベガスパイなどの小型機でより軽量なプログラムを実行
    =>JVMモジュール依存図を使用して、アプリケーションに必要なモジュールを確認します.必要なモジュールが見つからない場合、JVMは欠落したモジュールを報告して終了し、ランタイムエラーを回避します.
    (JPMS以前に、失われたクラスを実際に使用しようとしたとき(実行時の特定の時点で)エラーが見つかりました)

    Jigsawモジュールテスト


    プロジェクト構造



  • com.jigsawtest1
  • module-info定義
  •   module com.jigsawtest1 {
        exports jigsaw.car;
      }
  • jigsaw.car.Car
  •   package jigsaw.car;
      
      public class Car {
          private int price;
          private String carName;
      
          public Car(int price, String carName) {
              this.price = price;
              this.carName = carName;
          }
      
          public int getPrice() {
              return price;
          }
      
          public void setPrice(int price) {
              this.price = price;
          }
      
          public String getCarName() {
              return carName;
          }
      
          public void setCarName(String carName) {
              this.carName = carName;
          }
      
          public void changeCarName(String newName){
              carName="new_"+newName;
          }
      
          @Override
          public String toString() {
              return "Car{" +
                      "price=" + price +
                      ", carName='" + carName + '\'' +
                      '}';
          }
      }
  • jigsaw.car.notexported.PrivateCar
  •   package jigsaw.car.notexported;
      
      public class PrivateCar {
          private int price;
          private String carName;
      
          public PrivateCar(int price, String carName) {
              this.price = price;
              this.carName = carName;
          }
      
          public int getPrice() {
              return price;
          }
      
          public void setPrice(int price) {
              this.price = price;
          }
      
          public String getCarName() {
              return carName;
          }
      
          public void setCarName(String carName) {
              this.carName = carName;
          }
      
          public void changeCarName(String newName){
              carName="new_"+newName;
          }
      
          @Override
          public String toString() {
              return "Car{" +
                      "price=" + price +
                      ", carName='" + carName + '\'' +
                      '}';
          }
      }
      

  • org.jigsawtest2
  • module-info定義
  •   module org.jigsawtest2 {
          requires com.jigsawtest1;
      }
  • jigsaw.person.Person
  •   package jigsaw.person;
      
      import jigsaw.car.Car;
      
      public class Person {
          String name;
          int age;
          Car car;
      
          public Person(String name, int age, Car car) {
              this.name = name;
              this.age = age;
              this.car = car;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      }
  • jigsawTest
  •   package jigsaw.person;
      
      import jigsaw.car.Car; // module-info에 정의되어있으므로 다른 모듈이어도 사용 가능
      //import jigsaw.car.notexported.PrivateCar;
      
      /* com.jigsawtest1 모듈에 exports 되어있지 않은 패키지이므로 import해도 오류발생
      Package 'jigsaw.car.notexported' is declared in module 'com.jigsawtest1',
       which does not export it to module 'org.jigsawtest2' */
      
      public class jigsawTest {
      
          public static void main(String[] args){
              Car car=new Car(10000,"super car");
              System.out.println(car);
              Person person=new Person("jerry",30,car);
              person.car.changeCarName("bmw");
              System.out.println(car);
      
             // PrivateCar privateCar = new PrivateCar(10000,"super car"); 사용 불가
          }
      }
    [output]
    Car{price=10000, carName='super car'}
    Car{price=10000, carName='new_bmw'}
    [注意]
  • openjdk - jigsaw