ホームページ  >  記事  >  Java  >  Javaの不変クラス

Javaの不変クラス

WBOY
WBOYオリジナル
2024-08-30 16:07:181149ブラウズ

この記事では、Java における immutable クラスについて説明します。また、不変クラスの使用法も見ていきます。 Java で不変クラスを作成する方法を示す Java コード例があります。不変クラスとは、内容を変更できないクラスです。

次に、不変クラスに関する重要な点をいくつか示します:

無料ソフトウェア開発コースを始めましょう

Web 開発、プログラミング言語、ソフトウェア テスト、その他

  • 不変クラスのオブジェクトは不変オブジェクトと呼ばれます。不変オブジェクトを扱う場合、オブジェクトの作成後にその状態を変更することはできません。オブジェクトの状態が変更されるたびに、新しいオブジェクトが取得されます。
  • 不変クラスには、その内容を変更するためのメソッドがありません。
  • Immutable クラスでは、ゲッター メソッドのみが使用可能であり、セッター メソッドは使用できません。
  • 不変クラスは、デフォルトでは本質的にスレッドセーフです。
  • Java のレガシー クラス、ラッパー クラス、String クラスは、Java の不変クラスの例です。

Java で不変クラスを使用するには?

このクラスを使用する前に、不変クラスがどのように作成されるかを理解しておくことが重要です。クラスを作成する際に留意すべき重要な点は次のとおりです:

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

Java における不変クラスの主な用途は次のとおりです。

  • 単純さ: 不変クラスの場合、各クラスは単一の状態にあります。したがって、シンプルなデザインパターンです。
  • スレッド セーフ: 不変クラスのもう 1 つの利点は、不変クラスのスレッド セーフな性質により同期が必要ないマルチスレッド環境の場合に得られます。
  • 堅牢な設計: アプリケーション内で不変クラスを記述すると、堅牢なコードが作成されます。

リストされた利点とは別に、不変クラスを使用するとパフォーマンスの問題が発生する可能性があります。したがって、スレッド セーフやその他の機能が重要でない場合は、パフォーマンス向上のために可変クラスの使用を検討できます。

Java の不変クラスの例

以下に挙げる例を示します:

例 #1 – 不変クラスの作成

次に、Java での不変クラスの作成を示す Java コード例を見ていきます。以下は、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の不変クラス

上記のコードは、クラス メンバーとして変更可能なオブジェクトを含まない不変クラスの作成を示しています。

例 #2 – Java の不変クラスの例

次に、変更可能なオブジェクトをメンバーとして持つ不変クラスを作成する方法を見ていきます。この場合、不変性を維持するには、いくつかの特別な処理が必要です。

不変クラス内の可変オブジェクトの問題:

これは、変更可能なメンバーを含む不変クラスの作成を示す通常のコード例です。

コード:

package com.edubca.immutabledemo;
import java.util.Date;
import java.text.SimpleDateFormat;
public final class ImmutableDemo {
final String studentName;
final int rollNumber;
final Date birthDate;
public ImmutableDemo  (String studentName, int rollNumber, Date birthDate) {
this.studentName = studentName;
this.rollNumber = rollNumber;
this.birthDate=birthDate;
}
public String getStudentName() {
return studentName;
}
public int getRollNumber() {
return rollNumber;
}
public Date getBirthDate() {
return birthDate;
}
public static void main(String[] args) throws Exception {
String birthDate= "31/09/1997";
ImmutableDemo obj = new ImmutableDemo  ("John" , 100, new SimpleDateFormat("dd/MM/yyyy").parse(birthDate));
System.out.println("Name is " + obj.getStudentName());
System.out.println("Roll Number is " + obj.getRollNumber());
System.out.println("Birth date is " + obj.getBirthDate());
obj.getBirthDate().setTime(1000);
System.out.println("After changing birth date>>>>>>>>>>>>");
System.out.println("Name is " + obj.getStudentName());
System.out.println("Roll Number is " + obj.getRollNumber());
System.out.println("Birth date is " + obj.getBirthDate());
}
}

出力:

Javaの不変クラス

上記の出力から、生年月日が変更されたため、オブジェクトの内容が変更されたことがわかります。これは不変クラスのルールに違反します。

不変クラス内の可変オブジェクトの問題の解決策:

このようなケースに対処するには、コードにいくつかの変更を実装する必要があります。変更されたコードでは、取得メソッドから可変オブジェクトを返すときに、元のオブジェクトは返されません。代わりに、オブジェクトのクローンを返します。したがって、クローン オブジェクトに変更を加えても、元のオブジェクトには影響しません。変更されたコードは次のとおりです:

コード:

package com.edubca.immutabledemo;
import java.util.Date;
import java.text.SimpleDateFormat;
public final class ImmutableDemo {
final String studentName;
final int rollNumber;
final Date birthDate;
public ImmutableDemo  (String studentName, int rollNumber, Date birthDate) {
this.studentName = studentName;
this.rollNumber = rollNumber;
this.birthDate=birthDate;
}
public String getStudentName() {
return studentName;
}
public int getRollNumber() {
return rollNumber;
}
public Date getBirthDate() {
return (Date)birthDate.clone();
}
public static void main(String[] args) throws Exception {
String birthDate= "31/09/1997";
ImmutableDemo obj = new ImmutableDemo  ("John" , 100, new SimpleDateFormat("dd/MM/yyyy").parse(birthDate));
System.out.println("Name is " + obj.getStudentName());
System.out.println("Roll Number is " + obj.getRollNumber());
System.out.println("Birth date is " + obj.getBirthDate());
obj.getBirthDate().setTime(1000);
System.out.println("After changing birth date>>>>>>>>>>>>");
System.out.println("Name is " + obj.getStudentName());
System.out.println("Roll Number is " + obj.getRollNumber());
System.out.println("Birth date is " + obj.getBirthDate());
}
}

出力:

Javaの不変クラス

上記の出力から、日付値に変化がないことがわかります。したがって、クラスの不変性はそのまま残ります。

結論

上記の説明から、Java の不変クラスについて明確に理解できました。また、その利点も確認しました。

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

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