首頁 >Java >java教程 >Java 中的不可變類

Java 中的不可變類

WBOY
WBOY原創
2024-08-30 16:07:181190瀏覽

在這篇文章中,我們將解釋java中的不可變類別。此外,我們還將看到不可變類的用途。將有 java 程式碼範例展示如何在 java 中建立不可變類別。不可變類別是其內容不能更改的類別。

以下是關於不可變類別的一些要點:

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

  • 不可變類別的物件稱為不可變物件。在處理不可變物件時,我們不允許在物件建立後更改其狀態。每當物件的狀態改變時,我們都會得到一個新物件。
  • 不可變類別不提供任何更改其內容的方法。
  • 在 Immutable 類別中,只有 getter 方法可用,而沒有 setter 方法。
  • 不可變類別本質上預設是線程安全的。
  • Java 遺留類別、包裝類別、String 類別是 java 中不可變類別的範例。

如何在 Java 中使用不可變類別?

在使用此類之前,了解不可變類別是如何創建的非常重要。以下是創建課程時需要牢記的要點:

  • 不可變類別必須是final的,因為它不應該被繼承。
  • 不可變類別的所有欄位都應該是final的。
  • 如果任何可變物件用作不可變類別中的字段,則必須進行特殊處理以防止其內容被修改。
  • 應該存在公共構造函數。
  • 應該定義所有變數的 getter 方法。
  • 任何變數都不應該出現 Setter 方法。

以下是java中不可變類別的主要用途:

  • 簡單性:由於在不可變類的情況下,每個類別都處於單一狀態;因此,這是一個簡單的設計模式。
  • 執行緒安全:不可變類別的另一個優點是在多執行緒環境中,由於不可變類別的執行緒安全性質,不需要同步。
  • 健全的設計:在應用程式中編寫不可變的類別會產生健全的程式碼。

除了列出的優點之外,使用不可變類別時還可能存在一些效能問題。因此,在線程安全性和其他功能不重要的情況下,我們可以考慮使用可變類別來提高效能。

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:Java 適配器類下一篇:Java 適配器類