logo

Java における可変と不変

Java はオブジェクト指向プログラミング言語です。これはオブジェクト指向プログラミング言語であるため、すべてのメソッドとメカニズムはオブジェクトを中心に展開します。オブジェクトベースの 1 つの概念は変更可能であり、 Javaでは不変 。 Java のオブジェクトは可変または不変のいずれかです。それはオブジェクトをどのように反復できるかによって異なります。

このセクションでは、Java の可変オブジェクトと不変オブジェクトについて説明します。さらに、それらの違いを見ていきます。

可変オブジェクトとは

可変オブジェクトは、初期化後に値を変更できるオブジェクトです。オブジェクトの作成後に、フィールドや状態などのオブジェクトの値を変更できます。例えば、 java.util.Date文字列ビルダー文字列バッファ 、など。

既存の可変オブジェクトに変更を加えた場合、新しいオブジェクトは作成されません。代わりに、既存のオブジェクトの値が変更されます。これらのオブジェクトのクラスは、オブジェクトに変更を加えるためのメソッドを提供します。

ゲッターとセッター ( get() メソッドと set() メソッド) は可変オブジェクトで使用できます。 Mutable オブジェクトはスレッドセーフである場合とそうでない場合があります。

Javaの部分文字列関数

不変オブジェクトとは

不変オブジェクトは、初期化後に値を変更できないオブジェクトです。オブジェクトが作成されると、何も変更することはできません。例えば、 プリミティブオブジェクト int など、 長さ浮くダブルすべての従来のクラス、 ラッパークラス文字列クラス 、など。

一言で言えば、不変とは、変更されない、または変更できないことを意味します。不変オブジェクトが作成されると、そのオブジェクトの値と状態は変更できません。

不変オブジェクトにはゲッター ( get() メソッド) のみが使用でき、セッター ( set() メソッド) は使用できません。

文字列をintに変更する方法

可変オブジェクトと不変オブジェクトのクラスを作成する方法を見てみましょう。

可変クラスを作成する方法

可変クラスを作成するには、次の 2 つのことが不可欠です。

  • フィールド値を変更する方法
  • オブジェクトのゲッターとセッター

以下の可変クラスの例を考えてみましょう。

 public class JtpExample { private String s; JtpExample(String s) { this.s = s; } public String getName() { return s; } public void setName(String coursename) { this.s = coursename; } public static void main(String[] args) { JtpExample obj = new JtpExample('JavaTpoint'); System.out.println(obj.getName()); // Here, we can update the name using the setName method. obj.setName('Java Training'); System.out.println(obj.getName()); } } 

出力:

 JavaTpoint Java Training 

上記の例では、setName メソッドを使用して名前の値を変更しています。

不変クラスを作成する方法

不変クラスを作成するには、次のことが不可欠です。

  • Final クラス。拡張できないように Final として宣言されます。
  • フィールドへの直接アクセスがブロックされるように、すべてのフィールドはプライベートである必要があります。
  • セッターなし
  • すべての可変フィールドは、初期化後に反復できないように、最終的なものである必要があります。

以下の例を考えてみましょう。

 public class JtpExample1 { private final String s; JtpExample1(final String s) { this.s = s; } public final String getName() { return s; } public static void main(String[] args) { JtpExample obj = new JtpExample('Core Java Training'); System.out.println(obj.getName()); } } 

出力:

 Core Java Training 

したがって、変更可能および不変のオブジェクトとクラスについて説明しました。それらの違いについて説明しましょう。

可変オブジェクトと不変オブジェクトの違い

以下に、可変オブジェクトと不変オブジェクトの主な違いをいくつか示します。 ジャワ :

Googleは何の略ですか
  • 可変オブジェクトは、新しいオブジェクトを追加せずに、任意の値または状態に変更できます。一方、不変オブジェクトは、作成後にその値や状態を変更することはできません。不変オブジェクトの場合、オブジェクトの状態を変更するたびに、新しいオブジェクトが作成されます。
  • 可変オブジェクトは、オブジェクトの内容を変更するメソッドを提供します。これに比べて、不変オブジェクトには値を変更するメソッドがありません。
  • 可変オブジェクトは、セッターとゲッターの両方をサポートします。比較的、不変オブジェクトはセッターのみをサポートし、ゲッターはサポートしません。
  • Mutable オブジェクトはスレッド セーフである場合とそうでない場合がありますが、不変オブジェクトはデフォルトでスレッド セーフです。
  • 変更可能なクラスの例は、StringBuffer、Java.util.Date、StringBuilder などです。一方、変更不可能なオブジェクトは、レガシー クラス、ラッパー クラス、String クラスなどです。

以下の表を考えてみましょう。

可変 不変
初期化後に可変オブジェクトの値を変更できます。 不変オブジェクトが開始されると、その値を変更することはできません。
状態は変更できます。 状態は変更できません。
可変オブジェクトでは、新しいオブジェクトは形成されません。 不変オブジェクトでは、オブジェクトの値が変更されると新しいオブジェクトが形成されます。
オブジェクトを変更するメソッドを提供します。 オブジェクトの値を変更するメソッドは提供されません。
オブジェクトを扱うための get() メソッドと set() メソッドをサポートしています。 オブジェクトの値を渡す get() メソッドのみをサポートします。
可変クラスはスレッドセーフである場合とそうでない場合があります。 不変クラスはスレッドセーフです。
可変クラスの作成に不可欠なのは、フィールド、ゲッター、セッターを変更するためのメソッドです。 不変クラスを作成するために不可欠なものは、最終クラス、プライベート フィールド、最終可変オブジェクトです。

Java の文字列が不変である理由

Java の String は、ほぼすべての Java プログラムで使用されるため、非常に特殊なクラスです。そのため、パフォーマンスとセキュリティを強化するために Immutable になっています。詳しく理解してみましょう:

Java では、文字列にリテラルの概念が使用されます。多くの参照変数を持つオブジェクトがあるとします。このようなシナリオでは、参照変数の値を変更すると、オブジェクト全体とそのすべての値に影響します。

上記の理由とは別に、次の理由も String を不変にする原因となります。

不変オブジェクトは非常に単純です。同期の必要がなく、本質的にスレッドセーフです。ただし、不変オブジェクトは他のオブジェクトの優れた構成要素となるため、特別な注意を払う必要があります。

ほとんどの開発者は、後で変更できないように String を最終オブジェクトにします。

アメリカには都市がいくつありますか

結論

Java の可変オブジェクトと不変オブジェクトについて説明しましたが、これで、可変オブジェクトと不変オブジェクトとクラスの両方について明確に理解できました。さらに、可変クラスと不変クラスを作成する方法についても見てきました。

不変オブジェクトは、開始後に値と状態を変更でき、スレッドセーフである場合とそうでない場合があることに注意してください。比較的、不変オブジェクトは、その状態と値、およびデフォルトのスレッドセーフに変更できません。