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

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

目次

説明 ミュータブル(可変)
  イミュータブル(不変)

ミュータブル(可変)

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

ミュータブルのサンプルです。コードはPHPです。

<?php
//ミュータブルの例
$date1 = new DateTime('2020-8-10 22:30:10');

// 3日後を求める
$date2 = $date1->modify("+3 day");
print $date2->format("Y/m/d"); // 2020/08/13

// 3日後を求める
$date3 = $date1->modify("+3 day");
print $date3->format("Y/m/d"); // 2020/08/16

3行目は、DateTimeのインスタンスを生成しています。
6行目は、$date1の3日後を求め、$date2に代入しています。
このときインスタンスの$date1も3日増えます。(状態が変わる)

10行目は、3行目の$date1の3日後を求めようとしますが、
6行目で$date1は3日増えた状態になっているので
結果として$date3は6日増えます。
→ミュータブルです。

イミュータブル(不変)

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

イミュータブルのサンプルです。コードはPHPです。

<?php
//イミュータブルの例
$date1 = new DateTimeImmutable('2020-8-10 22:30:10');

// 3日後を求める
$date2 = $date1->modify("+3 day");
print $date2->format("Y/m/d"); // 2020/08/13

// 3日後を求める
$date3 = $date1->modify("+3 day");
print $date3->format("Y/m/d"); // 2020/08/13

3行目は、DateTimeImmutableのインスタンスを生成しています。
6行目は、$date1の3日後を求め、$date2に代入しています。
このときインスタンスの$date1は3日増えません(状態が変わらない)。3日増えたコピーを返します。

10行目は3行目の$date1の3日後を求め
結果として$date3に3日増えます。
→イミュータブルです。

関連の記事

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

△上に戻る