不変とはどういう意味ですか? 質問する

不変とはどういう意味ですか? 質問する

不変とは正確には何を意味しますか。つまり、オブジェクトが可変または不変である場合の結果は何でしょうか。特に、Java のStringが不変なのはなぜですか。

StringBuilder私の理解では、型は と同等の変更可能なものであるということです。ではなくをString使用するのはどのような場合でしょうか。またその逆はどうでしょうか。StringBuilderString

ベストアンサー1

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

これは、他の誰かがその内容を変更することを心配することなく、オブジェクトへの参照を渡すことができるため便利です。特に同時実行を扱う場合、変更されないオブジェクトではロックの問題はありません。

例えば

class Foo
{
     private final String myvar;

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

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

FoogetValue()呼び出し元が文字列内のテキストを変更する可能性があることを心配する必要はありません。

と同様のクラスを想像してくださいFoo。ただし、メンバーとして ではStringBuilderなく がある場合、 の呼び出し元はインスタンスの属性を変更できることがStringわかります。getValue()StringBuilderFoo

また、不変性にはさまざまな種類があることにも注意してください。エリック・リッパートは、ブログ記事これについて。基本的に、インターフェースは不変だが、舞台裏では実際には変更可能なプライベート状態(したがって、スレッド間で安全に共有できない)を持つオブジェクトを持つことができます。

おすすめ記事