可変/不変オブジェクトとは何ですか?またその目的は何ですか?  - 1

「こんにちは、アミーゴ!」

「こんにちは、ビラーボ!」

「今日はビラーボが可変オブジェクトと不変オブジェクトについてお話します。

「作成後に変更できるオブジェクトはmutableと呼ばれます。」

「作成後に変更できないオブジェクトはimmutableと呼ばれます。」

「オブジェクトを変更できるかどうかは何によって決まりますか?」

「新しいクラスの作成者は、そのクラスのオブジェクトを不変にすることができます。たとえば、すべてのセッターをプライベートにすると、オブジェクトにはコンストラクターとゲッターのみが含まれます。つまり、作成後に変更することは不可能になります。 。」

「それで、それは何の意味があるのでしょうか?」

「不変オブジェクトには多くの便利なプロパティがありますが、ほぼすべての不変オブジェクトに共通する 2 つのプロパティを取り上げます。」

1) 不変オブジェクトは、可変オブジェクトよりも実装がはるかに簡単です。

2) 不変オブジェクトは、複数のスレッド間で同時に自由に使用できます。

「開発者が不変クラスを作成すると決めた場合、通常はクラスの変更可能バージョンと不変バージョンの両方を作成します。」

「しかし、1 つのクラスではなく 2 つのクラスを記述することに何の意味があるのでしょうか?」

「オブジェクトの不変バージョンが、変更可能なバージョンよりもはるかに単純/高速になる場合、価値がある場合があります。そこで、2 つのバージョンが作成されます。これは、ArrayList と LinkedList のようなものです。両方ともリストですが、一方は特定の目的に最適化されています。そして2番目は他の人のためです。」

「それはすでに理にかなっています。」

「変更可能なバージョンを持たない、純粋に不変更なクラスもあります。」

「しかし、これらのオブジェクトの 1 つで何かを変更する必要がある場合はどうすればよいでしょうか? 不変オブジェクトで実際に何ができるのでしょうか?」

「通常、不変クラスにはオブジェクトを変更するかのように動作するさまざまなメソッドが含まれていますが、これらのメソッドはオブジェクト自体を変更するのではなく、単に新しいオブジェクトを作成してそれを返すだけです。」

"ここではいくつかの例を示します:"

Javaコード 説明
String s = "london";
String s2 = s.toUpperCase();
その結果、s には文字列 «london» が含まれ、s2 には «LONDON» が含まれます。
Integer i = 1;
Integer j = i;
j++;
実際に何が起こるかは次のとおりです。
Integer i = new Integer(1);
整数 j = i;
j = 新しい整数(i.getInt()+1);

「String クラスは不変クラスです。すべての String オブジェクトは不変ですが、だからといってそれらのオブジェクトを操作できなくなるわけではありません。たとえば、String クラスの toUpperCase () メソッドは String を大文字に変換します (つまり、すべての小文字を置き換えます)。ただし、このメソッドは文字列自体を変更するのではなく、新しい文字列を返します。この新しい文字列は、すべての文字が大文字 (大文字) であることを除けば、最初の文字列と同じです。

「Integer クラスも不変クラスです。すべての Integer オブジェクトは不変です。Integer オブジェクトを変更するたびに、実際には新しいオブジェクトが作成されます。」

「なんて面白いんだろう!万歳、ビラーボ。」

「万歳、ビラーボ万歳!」