不変とは正確には何を意味しますか。つまり、オブジェクトが可変または不変である場合の結果は何でしょうか。特に、Java のString
が不変なのはなぜですか。
StringBuilder
私の理解では、型は と同等の変更可能なものであるということです。ではなくをString
使用するのはどのような場合でしょうか。またその逆はどうでしょうか。StringBuilder
String
ベストアンサー1
不変とは、オブジェクトのコンストラクターの実行が完了すると、そのインスタンスを変更できないことを意味します。
これは、他の誰かがその内容を変更することを心配することなく、オブジェクトへの参照を渡すことができるため便利です。特に同時実行を扱う場合、変更されないオブジェクトではロックの問題はありません。
例えば
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
また、不変性にはさまざまな種類があることにも注意してください。エリック・リッパートは、ブログ記事これについて。基本的に、インターフェースは不変だが、舞台裏では実際には変更可能なプライベート状態(したがって、スレッド間で安全に共有できない)を持つオブジェクトを持つことができます。