在這篇文章中,我們將解釋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()); } }
輸出:
上面的程式碼顯示了一個不可變類別的創建,該類別不包含任何可變物件作為類別成員。
範例 #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()); } }
輸出:
從上面的輸出中,我們可以看到,由於出生日期更改,物件的內容也發生了更改。這打破了不可變類別的規則。
不可變類別中的可變物件問題的解決方案:
為了處理這種情況,需要在程式碼中進行一些更改。在修改後的程式碼中,當從獲取方法返回可變物件時,我們不返回原始物件;相反,我們返回物件的克隆。因此,對克隆物件的變更不會對原始物件產生任何影響。這是修改後的程式碼:
代碼:
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 中的不可變類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Java是平台獨立的,因為其"一次編寫,到處運行"的設計理念,依賴於Java虛擬機(JVM)和字節碼。 1)Java代碼編譯成字節碼,由JVM解釋或即時編譯在本地運行。 2)需要注意庫依賴、性能差異和環境配置。 3)使用標準庫、跨平台測試和版本管理是確保平台獨立性的最佳實踐。

Java'splatFormIndenceIsnotsimple; itinvolvesComplexities.1)jvmcompatiblemustbebeeniblemustbeensuredacrossplatforms.2)Nativelibrariesandsystemcallsneedcarefulhandling.3)

Java'splatformindependencebenefitswebapplicationsbyallowingcodetorunonanysystemwithaJVM,simplifyingdeploymentandscaling.Itenables:1)easydeploymentacrossdifferentservers,2)seamlessscalingacrosscloudplatforms,and3)consistentdevelopmenttodeploymentproce

thejvmistheruntimeenvorment forexecutingjavabytecode,Cocucialforjava的“ WriteOnce,RunanyWhere”能力

JavaremainsatopchoicefordevelopersduetoitsplatFormentence,對象與方向設計,強度,自動化的MememoryManagement和ComprechensivestAndArdArdArdLibrary

Java'splatFormIndependecemeansDeveloperScanWriteCeandeCeandOnanyDeviceWithouTrecompOlding.thisAcachivedThroughThroughTheroughThejavavirtualmachine(JVM),WhaterslatesbyTecodeDecodeOdeIntComenthendions,允許univerniverSaliversalComplatibilityAcrossplatss.allospplats.s.howevss.howev

要設置JVM,需按以下步驟進行:1)下載並安裝JDK,2)設置環境變量,3)驗證安裝,4)設置IDE,5)測試運行程序。設置JVM不僅僅是讓其工作,還包括優化內存分配、垃圾收集、性能調優和錯誤處理,以確保最佳運行效果。

toensurejavaplatFormIntence,lofterTheSeSteps:1)compileAndRunyOpplicationOnmultPlatFormSusiseDifferenToSandjvmversions.2)upureizeci/cdppipipelinelikeinkinslikejenkinsorgithikejenkinsorgithikejenkinsorgithikejenkinsorgithike forautomatecross-plateftestesteftestesting.3)


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。