1. ホーム
  2. java

[解決済み] イミュータブルとはどういう意味ですか?

2022-03-24 11:43:48

質問

これは今までで一番バカな質問かもしれませんが、Javaの初心者にとってはかなり分かりにくい質問だと思います。

  1. が何を意味するのか、誰か明確にしてください。 不変 ?
  2. なぜ String は不変ですか?
  3. イミュータブルオブジェクトのメリット/デメリットは何ですか?
  4. のようなミュータブルオブジェクトは、なぜ StringBuilder は String よりも優先され、その逆もまた然りですか?

いい例(Javaで)があれば、本当にありがたいです。

どのように解決するのですか?

Immutableとは、あるオブジェクトのコンストラクタの実行が完了したら、そのインスタンスは変更できないことを意味します。

これは、他の誰かがその内容を変更することを心配することなく、オブジェクトへの参照を受け渡しできることを意味し、便利です。 特に並行処理を行う場合、変更されることのないオブジェクトはロックの問題が発生しません。

class Foo
{
     private final String myvar;

     public Foo(final String initialValue)
     {
         this.myvar = initialValue;
     }

     public String getValue()
     {
         return this.myvar;
     }
}

Foo を呼び出す側が心配する必要はありません。 getValue() は文字列のテキストを変更するかもしれません。

と同じようなクラスを想像してみると Foo を使用し、しかし StringBuilder ではなく String をメンバーとして呼び出した場合、その呼び出し元が getValue() を変更することができるようになります。 StringBuilder 属性は Foo のインスタンスを作成します。

また、さまざまな種類の不変性を見つけることができるので、注意してください。Eric Lippertが書いた ブログ記事 このことについて 基本的に、インターフェースは不変だが、裏側で実際のミュータブルはプライベートな状態(したがってスレッド間で安全に共有できない)であるオブジェクトを持つことができます。