あるインタビュアーから、クラスを不変にすることのデメリットについて尋ねられました。不変オブジェクトが占有するヒープ領域と、それが Java アプリケーションのパフォーマンスをどのように低下させるかについて回答しました。
Javaでオブジェクトを不変にすることの他の欠点は何ですか?
あるインタビュアーから、クラスを不変にすることのデメリットについて尋ねられました。不変オブジェクトが占有するヒープ領域と、それが Java アプリケーションのパフォーマンスをどのように低下させるかについて回答しました。
Javaでオブジェクトを不変にすることの他の欠点は何ですか?
欠点は、「値」を変更するために新しいオブジェクトを作成する必要があることです。クラスが頻繁に「変更」されるものを表している場合、大量のオブジェクトを作成し、ガベージ コレクターに負荷をかけます。
BigIntegerを取りましょう
BigInteger i1 = BigInteger.valueOf(1);
addメソッドがありますが、1を追加することはできません。不変なので、次のようになります。
BigInteger i2 = i1.add(i1);
つまり、毎回新しいオブジェクトが作成されます。つまり、不変のBigIntegerを使用した演算は非常に低速です。
また、不変オブジェクトをデシリアライズ/マテリアライズすることは、通常、パラメーターのないコンストラクターを使用せずにクラスを作成する必要があるため、はるかに困難になる可能性があることも考慮する必要があります。
オブジェクトが変更可能であるというアプリケーション要件がない場合は、オブジェクトを変更不可にしても不利益はないので、変更する必要があります。
オブジェクトが変更可能であるというアプリケーション要件がある場合は、オブジェクトを変更可能にします。