Java ミュータブルとイミュータブルの違い

Javaのミュータブルとイミュータブルの違いです。

目次

説明 ミュータブル
  イミュータブル

ミュータブル

  • インスタンスを作成した後、そのインスタンスの状態が変わる可能性があることです。
  • 日時の計算等で使用するCalendarクラスのインスタンスは、日時の加算でインスタンスの状態が変わります。
    →ミュータブルです。
  • 想定していない更新が起こる可能性があるためイミュータブルより安全性は落ちます。
  • mutableは、可変という意味です。

ミュータブルのサンプルです。
日時をセットし2日後を求めるメソッドを2回繰り返します。

package test1;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Test1 {
	public static void main(String[] args) {
		// インスタンスを生成
		Calendar cal1 = Calendar.getInstance();
		
		// 指定日時をセット 2020/05/10 22:30:10
		cal1.set(2020,04,10,22,30,10);
		
		// 指定した日時の2日後を求める
		cal1.add(Calendar.DATE, 2);
		// Date型に変換
		Date date1 = cal1.getTime();
		 // 表示形式を指定
 		SimpleDateFormat sdformat 
 		= new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 		String fdate1 = sdformat.format(date1);
 		System.out.println(fdate1); // 2020/05/12 22:30:10
 		
		// 指定した日時の2日後を求める
		cal1.add(Calendar.DATE, 2);
		// Date型に変換
		Date date2 = cal1.getTime();
		 // 表示形式を指定
 		SimpleDateFormat sdformat2 
 		= new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 		String fdate2 = sdformat2.format(date2);
 		System.out.println(fdate2); // 2020/05/14 22:30:10
	}
}

9行目は、インスタンスを生成しています。
15行目は、指定した日時の2日後を求めています。
インスタンスの状態が変わります。
→ミュータブルです。
25行目は、再度日時の2日後を求めています。
結果として、22行目と32行目で日時が異なります。

イミュータブル

  • インスタンスを作成した後、そのインスタンスの状態が変わらないことです。
  • 日時の計算等で使用するLocalDateTimeクラスのインスタンスは、日時の加算で新しいインスタンスを返します。元のインスタンスの状態は変わりません。
    →イミュータブルです。
  • 想定していない更新を防ぐことができるためミュータブルより安全度はあります。
  • immutableは、不変という意味です。

イミュータブルのサンプルです。
日時をセットし2日後を求めるメソッドを2回繰り返します。

package test1;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Test1 {
	public static void main(String[] args) {
		// 指定日時をセット 2020/05/10 22:30:10
		LocalDateTime ldt1 = LocalDateTime.of(2020,05,10,22,30,10);
		
		//2日後を求める
		LocalDateTime date1 = ldt1.plusDays(2);
        
		// String型+表示形式を指定する
		DateTimeFormatter dtFormat  
		= DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
 		String fdate1 = date1.format(dtFormat);
 		System.out.println(fdate1); // 2020/05/12 22:30:10
 		
		//2日後を求める
		LocalDateTime date2 = ldt1.plusDays(2);
        
		// String型+表示形式を指定する
		DateTimeFormatter dtFormat2 
		= DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
 		String fdate2 = date2.format(dtFormat2);
 		System.out.println(fdate2); // 2020/05/12 22:30:10
	}
}

8行目は、インスタンスを生成しています。
11行目は、指定した日時の2日後を求めています。
新たなインスタンスを返します。
元のインスタンスのldt1は、状態が変わらないのでイミュータブルです。
20行目は、再度日時の2日後を求めています。
結果として、17行目と26行目は日時が同じです。

関連の記事

静的型付けと動的型付けの違い
シャローコピーとディープコピーの違い

△上に戻る