🙌

プログラミング自主学習 DAY60 Module/Exception

2023/07/26に公開

Module

可動性(exportsをしない場合)

プログラムが「モジュールa」のパッケージ1,パッケージ2が必要であり、「モジュールb」のパッケージ3 が必要とする。しかし、機能的にパッケージ2が修正が多いとすれば、いちいちプログラムを修正しなければならない。
そのため、パッケージ1のみexportし、同じモジュールa所属のパッケージBはexportしない。
そうすれば、プログラムからパッケージ2を直接参照することはできないが、
同じモジュール内のパッケージ1から2をimportし、必要によって、使用すれば、プログラムでもrequireをわざと修正せずにより柔軟に使用することができ、依存関係をゆるくなるため、自由度が上がる。

<module a>


module my_module_a {
	exports pack1;
	//exports pack2;
}


package pack1;

import pack2.B1;

public class A {
	//field
	//constructor
	//method
	public void method() {
		System.out.println("A-method");
		
		B1 b = new B1();
		b.method();
	}
}

<program>

package app;

import pack1.A;
//import pack2.B;
import pack3.C;

public class Main {
	public static void main(String[] args) {
		
		A a = new A();
		a.method();
		
		//B b = new B();
		//b.method();
		
		C c = new C();
		c.method();

	}

}
	
A-method
B-method
C-method	

パッケージ1のBを隠しても、同じモジュールaのパッケージからimportするため、パッケージ1.Bも使用できる。


transitive

この場合は、application_2はmodule bの機能を使えない。
そのため、transtive を依存するmoduleに付けて依存するmoduleが依存するmoduleを使用することもできる。

module_my_application_2 {
  requires my_module_a;	
}	
	
module_my_module a{
 exports pack1;
 requires transitive my_module_b;
}



my_module_aのbuild pathprojectmodulepathにmy_module_bを追加し、コードを修正する。

	
package pack1;

import pack2.B1;
import pack3.C;     //依存関係であるため、importができるようになった。

public class A {
	//field
	//constructor
	//method
	public void method() {
		System.out.println("A-method");
		
		B1 b = new B1();
		b.method();
	}	
	
	public C getC() {  //Cをリターンするメソッドを宣言する。
		C c = new C();  
		return c;         
	}
	
}
 
package app;

import pack1.A;
//import pack2.B;
import pack3.C;

public class Main {
	public static void main(String[] args) {
		
		A a = new A();
		a.method();
		
		//B b = new B();
		//b.method();
		
		C c = new C();
		c.method();
		
		C result = a.getC();
		result.method();

	}

}	
	
	
A-method
B-method
C-method
C-method	

my_application_2より、my_modules_bをrequiresしなくても、依存しているaがbをtransitive requiresしているため、my_application_2でもmy_modules_bを使用することができる。

module my_module {
	requires transitive my_module_a;
	requires transitive my_module_b;
}		

また、このように、集合モジュールを作成することもできる。

Reflection

Reflectionとは、実行途中にタイプ(class,interface)を検査し、どのようなメンバーがあるか(フィールド、メソッド)調査することだ。

Eclipseのoutlineを見れば、分かりやすい。

しかし、隠されたモジュール(exportsしていないため、見えないがrequireされたため、使用はできる)は基本的には、reflectionを許可していない。

めったにない状況だが、隠されたモジュールのreflectionを許可したい場合は、open,opensを入力し、module-infoを修正する。


<モジュール全体をreflection>

CaseModule
open module modulename{
...	
}	

<モジュールのパッケージをreflection>

CasePackages
module modulename{
 ...
  opens package1;
  opens package2;	
}	

<モジュールのパッケージを指定したモジュールのみreflection>

CasePackagesToModules
module modulename{
 ...
  opens package1 to modulename,modulename2...;
  opens package2 to modulename3; 	
}	
	

Exception

ERROR

ハードウェアなどの問題により、アプリケーション実行できたない場合。

Exception(例外)

プログラム内の問題(間違った使用方法、コードの問題)により、起こったトラブル。
例外が発生してもプログラムは終了される。

javaは、例外が発生すると、例外クラスよりオブジェクを生成し、例外処理時、使用される。
すべての例外クラスは、Throwableを継承し、追加的にExceptionクラスを継承する。

例外は大きく、コンパイラがチェックできる例外と、チェックできないランタイム例外がある。


https://medium.com/@bhagya.devduni98/exception-handling-headfirst-java-chapter-11-1f5664501e2e

例外処理コード

例外が生じた際に、プログラムを終了せずに、続くため処理するコードを例外処理という。

<flow>

try -> catch ->finally

try内の例外が生じるとcatchで例外を処理し、finallyに渡す。
ただし、例外が生じても、生じなくてもfinallyは実行される。

Discussion