ホームページ  >  記事  >  Java  >  可変 Java と不変 Java

可変 Java と不変 Java

WBOY
WBOYオリジナル
2024-08-30 15:41:09356ブラウズ

可変オブジェクトには変更可能なフィールドがあります。不変オブジェクトには、オブジェクトの作成後に変更できるフィールドがありません。不変オブジェクトは、作成後に状態が変更できないオブジェクトです。 Mutable と Immutable は、Java のオブジェクトの 2 つのカテゴリです。この記事では、Java における可変オブジェクトと不変オブジェクトの違いについて説明します。また、Java の可変クラスと不変クラスの違いを示す Java コード例も示します。

広告 このカテゴリーの人気コース JAVA マスタリー - スペシャライゼーション | 78 コース シリーズ | 15 回の模擬テスト

可変 Java と不変 Java の直接比較 (インフォグラフィックス)

以下は、可変 Java と不変 Java のトップ 6 の違いです:

可変 Java と不変 Java

可変 Java と不変 Java の主な違い

Java の可変オブジェクトと不変オブジェクトの主な違いは次のとおりです。

  • 可変オブジェクトとは、新しいオブジェクトを作成せずにオブジェクトの状態を変更できるオブジェクトです。つまり、可変オブジェクトは作成後に変更できます。不変オブジェクトの場合、オブジェクトの状態が変更されるたびに、新しいオブジェクトが取得されます。不変オブジェクトを扱う場合、オブジェクトの作成後にその状態を変更することはできません。
  • 一般に、可変オブジェクトはオブジェクトの内容を変更できるメソッドを提供しますが、不変オブジェクトはその内容を変更するためのメソッドを提供しません。
  • 可変 Java クラスにはゲッター メソッドとセッター メソッドが存在しますが、不変クラスではゲッター メソッドのみが使用可能で、セッター メソッドは使用できません。
  • 可変クラスはスレッドセーフである場合とそうでない場合がありますが、不変クラスはデフォルトでスレッドセーフです。
  • Java の変更可能なクラスの例は、java.util.Date、StringBuffer、StringBuilder などです。一方、Java のレガシー クラス、ラッパー クラス、String クラスは、Java の不変クラスの例です。

可変 Java と不変 Java の比較表

可変 Java と不変 Java の主な比較について説明します。

変更可能

 Mutable

Immutable

Java Mutable object can be modified after its creation. Java Immutable object cannot be modified after its creation.
No new object is formed when changes are made to an existing object. Whenever an existing object is changed, a new object is formed.
It provides methods to change the content of an object. It does not provide methods for changing the content of an object.
Getter and setter methods are present in mutable classes. Only getter methods are present and not setter methods.
Mutable classes may or may not be thread-safe. Immutable classes are thread-safe by default.
Some common examples of mutable classes in java are StringBuffer, StringBuilder, and java.util.Date. All Legacy classes, Wrapper classes, String class, are common examples of Immutable classes in java.

不変

Java Mutable オブジェクトは、作成後に変更できます。 Java Immutable オブジェクトは、作成後に変更できません。 既存のオブジェクトに変更を加えた場合、新しいオブジェクトは形成されません。 既存のオブジェクトが変更されるたびに、新しいオブジェクトが形成されます。 オブジェクトのコンテンツを変更するメソッドを提供します。 オブジェクトのコンテンツを変更するメソッドは提供されません。 ゲッター メソッドとセッター メソッドは可変クラスに存在します。 ゲッター メソッドのみが存在し、セッター メソッドは存在しません。 可変クラスはスレッドセーフである場合とそうでない場合があります。 不変クラスはデフォルトでスレッドセーフです。 Java の可変クラスの一般的な例としては、StringBuffer、StringBuilder、java.util.Date などがあります。 すべてのレガシー クラス、ラッパー クラス、文字列クラスは、Java における不変クラスの一般的な例です。 テーブル>

可変 Java と不変 Java の例

可変 Java と不変 Java の例を以下に示します。

例 #1 – Java の可変クラス

次に、Java での可変クラスと不変クラスの作成を示す Java コード例を見ていきます。

コード:

package com.edubca.mutabledemo;
public class MutableDemo {
private String studentName;
private int rollNumber;
MutableDemo (String studentName, int rollNumber) {
this.studentName = studentName;
this.rollNumber = rollNumber;
}
public String getStudentName() {
return studentName;
}
// this setter can modify the name
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public int getRollNumber() {
return rollNumber;
}
// this setter can modify roll number
public void setRollNumber(int rollNumber) {
this.rollNumber = rollNumber;
}
public static void main(String[] args) {
MutableDemo obj = new MutableDemo ("John" , 100);
System.out.println("Original Name is " + obj.getStudentName());
System.out.println("Original Roll Number is " + obj.getRollNumber());
// update the name, and roll number as  is mutable
obj.setStudentName("James");
obj.setRollNumber(102);
System.out.println("Modified Name is " + obj.getStudentName());
System.out.println("Modified Roll Number is " + obj.getRollNumber());
}
}

出力:

可変 Java と不変 Java

上記のコードは、ゲッターとセッターを使用して Java で可変クラスを作成する方法を示しています。

例 #2 – Java の不変クラス

次に、Java で不変クラスを作成する方法を見ていきます。

コード:

package com.edubca.immutabledemo;
public final class ImmutableDemo {
final String studentName;
final int rollNumber;
public ImmutableDemo  (String studentName, int rollNumber) {
this.studentName = studentName;
this.rollNumber = rollNumber;
}
public String getStudentName() {
return studentName;
}
public int getRollNumber() {
return rollNumber;
}
public static void main(String[] args) {
ImmutableDemo obj = new ImmutableDemo  ("John" , 100);
// Since no getters are available contents cannot be modified.
// Also as variables are declared final they cannot be modified
System.out.println("Name is " + obj.getStudentName());
System.out.println("Roll Number is " + obj.getRollNumber());
}
}

出力:

可変 Java と不変 Java

上記のコードは、Java 不変クラスの作成を示しています。不変クラスを作成するときは、次の点に留意する必要があります:

  • 不変クラスは継承できないため、final でなければなりません。
  • 不変クラスのすべてのフィールドは、final にする必要があります。
  • 変更可能なオブジェクトが不変更クラスのフィールドとして使用される場合、その内容が変更されないように特別な処理を実装する必要があります。
  • パブリック コンストラクターが存在する必要があります。
  • すべての変数のゲッター メソッドを定義する必要があります。
  • 変数にはセッター メソッドが存在してはなりません。

結論

上記の説明から、Java における可変と不変の違いが明確に理解できました。また、可変クラスと不変クラスがどのように作成されるかを示す Java の例も見てきました。不変クラスはデフォルトでスレッドセーフですが、可変クラスはスレッドセーフである場合とそうでない場合があることに注意することが重要です。

以上が可変 Java と不変 Javaの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。