Open3

immutableメモ

Ryouhei FurugenRyouhei Furugen

【Java】immutable

Immutableオブジェクトはフィールドを変更することができません。

  • フィールドはprivateで外からアクセスできない
  • setterが存在しない
  • クラスをfinalで宣言し、サブクラスからの変更できない
  • 可変オブジェクトを提供するgetterが存在しない

イミュータブルであれば、いくらインスタンスを生成しても同じものしか生まれて来ません

つまり、1つインスタンスを生成してしまえば、後はそれを参照するだけで良いのです。

以下サイトの抜粋です。

https://se-tomo.com/2019/09/17/【java】mutableとimmutableとは

Ryouhei FurugenRyouhei Furugen

immutableを使うメリット

mutableを使うデメリット

複数の変数が同じインスタンスへの参照を共有しているため、片方で変更操作をするともう片方にもその副作用が影響を及ぼします。

規模が大きくなってくると、こういった副作用がいつどこでされるかの把握が困難になっていくため、意図しない副作用に起因するバグに繋がるデメリットの方が大きくなっていきがちです。

immutableを使うメリット

immutableなオブジェクトは生成される(インスタンスを作る)と値が変更できないので、値を変更したい場合は変更したい値で新しくインスタンス作る。

先に作ったインスタンスが別のインスタンスと参照先が同じである場合は、別のインスタンスに影響を与えることはなくなる。

@immutableアノテーションの活用

immutableクラス定義の際には@immutableアノテーションを付けると良いです。

主に以下のメリットを得られます:

  • immutableなクラスとしての要件を満たしていない時に警告が出る
  • コンストラクターに const の付与が促される(漏れていると警告が出る)
  • クラス利用者に、それがimmutableなクラスであることが一目で伝わる

ほぼ以下サイトの抜粋

https://medium.com/flutter-jp/immutable-d23bae5c29f8

Ryouhei FurugenRyouhei Furugen

const

  • constはコンパイル時に値が代入され、それ以降変更できない
    定数って解釈。
  • インスタンスでは再代入は不可
  • 初期化必要。
  • インスタンス変数ではconstは不可
    (プログラム実行時にならないと、値が代入されないから)

const で宣言されていると定数として扱われ、持っている値が同じなら、同一であることがコンパイル時に保証されます
(もちろん別の値で初期化させると別物になります)。
つまり、何度実行しようとも同じものが使い回されてパフォーマンス的に有利になります。

Flutter/Dartにおけるimmutableの実践的な扱い方 | by mono  | Flutter 🇯🇵 | Medium

final

  • finalはプログラムを実行して値が代入されたあと変更できない。
    一回だけ代入可能、実行前、後だろうが一回入れたら終わり。
  • top-level 変数とクラス変数(static)は初期化必要。インスタンス変数は初期化不要だが、コンストラクタで初期化必要。
  • コレクションの場合は変数が参照型なので、要素の値の変更はできる。参照先アドレスが変わらなければok
    (コレクションの再代入は参照先アドレスが変わるので不可。)

参考

https://dart.dev/guides/language/effective-dart/design#prefer-making-fields-and-top-level-variables-final

https://medium.com/flutter-jp/immutable-d23bae5c29f8