Java中創建不可變對象實現細節和例子

當我們在Java中創建不可變對象時,我們需要確保對象的狀態在創建之后不能被修改。以下是一些具體的實現細節和例子,展示了如何在Java中創建不可變對象。

實現細節

  1. 使用final關鍵字
    • 類定義前使用final關鍵字,表示該類不能被繼承,從而防止子類覆蓋其方法或添加新的狀態。
    • 字段前使用final關鍵字,表示該字段的值在初始化之后不能被修改。
  2. 不提供修改器方法
    • 不提供任何setter方法,確保外部類不能通過公共接口修改對象的狀態。
  3. 構造函數中初始化所有字段
    • 在構造函數中初始化所有final字段,并確保一旦初始化,它們就不會被再次賦值。
  4. 確保引用的對象也是不可變的
    • 如果字段是引用類型,則需要確保引用的對象本身也是不可變的,或者字段引用的是不可變的集合(如Collections.unmodifiableList)。
  5. 返回不可變集合的視圖
    • 如果類包含集合類型的字段,并且需要對外提供訪問接口,可以返回該集合的不可變視圖,以防止外部類修改集合內容。

例子

簡單的不可變類
 

java復制代碼

public final class ImmutablePerson {
private final String name;
private final int age;
public ImmutablePerson(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
// 其他方法(如果有的話)...
@Override
public String toString() {
return "ImmutablePerson{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
引用不可變對象的類
 

java復制代碼

public final class ImmutableAddress {
private final String street;
private final String city;
private final String country;
public ImmutableAddress(String street, String city, String country) {
this.street = street;
this.city = city;
this.country = country;
}
// Getter方法...
@Override
public String toString() {
return "ImmutableAddress{" +
"street='" + street + '\'' +
", city='" + city + '\'' +
", country='" + country + '\'' +
'}';
}
}
// 使用ImmutableAddress的ImmutablePerson
public final class ImmutablePersonWithAddress {
private final String name;
private final int age;
private final ImmutableAddress address;
public ImmutablePersonWithAddress(String name, int age, ImmutableAddress address) {
this.name = name;
this.age = age;
this.address = address; // 引用不可變對象
}
// Getter方法...
@Override
public String toString() {
return "ImmutablePersonWithAddress{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
返回不可變集合視圖的例子
 

java復制代碼

public final class ImmutableContainer {
private final List<String> items = new ArrayList<>();
public ImmutableContainer(List<String> initialItems) {
// 假設initialItems是安全的,并且我們想要創建一個不可變的副本
this.items.addAll(initialItems);
}
public List<String> getItems() {
// 返回不可變的列表視圖
return Collections.unmodifiableList(items);
}
// 其他方法...
}

在上面的例子中,ImmutableContainer類包含了一個列表字段items,但在getItems方法中,它返回了一個不可變的列表視圖,從而防止了外部類修改該列表的內容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15761.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15761.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15761.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mysql中的慢查詢

Mysql慢查詢的一些sql命令 慢查詢的默認事件為10秒 #注意&#xff1a;慢查詢一般是在調試階段開啟的&#xff0c;在開發階段中一般不會開啟&#xff0c;會對效率產生延誤 #查詢慢查詢是否開啟 show variables like %general%; #慢查詢時間設置 show variables like long_query…

【運維項目經歷|018】:Elasticsearch智能數據分析平臺項目

目錄 項目名稱 項目背景 項目目標 項目成果 我的角色與職責 我主要完成的工作內容 本次項目涉及的技術 本次項目遇到的問題與解決方法 本次項目中可能被面試官問到的問題 問題1&#xff1a;本次項目周期&#xff1f; 問題2&#xff1a;服務部署架構方式及數量和配置&…

【簡明指南:Python中的異常處理與穩健代碼設計】

文章目錄 前言異常處理基礎捕獲多種異常確保資源被釋放使用else子句自定義異常結論 前言 軟件開發過程中&#xff0c;保證代碼的穩健性和可靠性至關重要。異常處理是實現這一目標的關鍵技術之一。在Python編程中&#xff0c;合理地捕獲和處理異常不僅能提高程序的健壯性&#…

查找專利渠道

官方渠道 常規檢索 (cnipa.gov.cn)https://pss-system.cponline.cnipa.gov.cn/conventionalSearch 佰騰網 佰騰網 - 查專利就上佰騰網_佰騰全球專利搜索平臺_商標查詢平臺_企業工商信息查詢平臺 (baiten.cn)https://www.baiten.cn/

NLP(19)--大模型發展(3)

前言 僅記錄學習過程&#xff0c;有問題歡迎討論 大模型訓練相關知識&#xff1a; 問題&#xff1a; 數據集過大&#xff0c;快速訓練模型過大&#xff0c;gpu跑不完 方案&#xff1a; 數據并行訓練&#xff1a; 復制數據&#xff08;batch_size&#xff09;到多個gpu&…

簡述vue-router的動態路由

動態路由 addRoute 是 Vue Router 中的一個功能&#xff0c;它允許你在運行時動態地向路由表添加路由規則。這在一些需要基于用戶行為或異步數據加載路由的場景中非常有用。以下是對 addRoute 功能的詳細解釋和使用示例&#xff1a; 1. 動態路由的概念 動態路由是指在應用運行…

[雜項]優化AMD顯卡對DX9游戲(天諭)的支持

目錄 關鍵詞平臺說明背景RDNA 1、2、3 架構的顯卡支持游戲一、 優化方法1.1 下載 二、 舉個栗子&#xff08;以《天諭》為例&#xff09;2.1 下載微星 afterburner 軟件 查看游戲內信息&#xff08;可跳過&#xff09;2.2 查看D3D9 幀數2.3 關閉游戲&#xff0c;替換 dll 文件2…

精品PPT | MES設計與實踐,業務+架構+實施(免費下載))

【1】關注本公眾號&#xff0c;轉發當前文章到微信朋友圈 【2】私信發送 MES設計與實踐 【3】獲取本方案PDF下載鏈接&#xff0c;直接下載即可。 如需下載本方案PPT/WORD原格式&#xff0c;請加入微信掃描以下方案驛站知識星球&#xff0c;獲取上萬份PPT/WORD解決方案&#x…

linux的chmod的數字太難記了,用u, g, o, a更簡單!

u, g, o, 和 a是用來設置或查看文件或目錄權限在類Unix或Linux系統中的特殊字符&#xff0c;它們分別代表文件或目錄的所有者(user)、所屬組(group)、其他用戶(others)和所有用戶(all users)。 而權限方r和w是其中的兩種&#xff0c;分別代表讀權限&#xff08;read&#xff0…

【探索數據結構】線性表之單鏈表

&#x1f389;&#x1f389;&#x1f389;歡迎蒞臨我的博客空間&#xff0c;我是池央&#xff0c;一個對C和數據結構懷有無限熱忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;這里是我分享C/C編程、數據結構應用的樂園? &#x1f388;&#x1f388;&…

Autodl服務器中Faster-rcnn(jwyang)復現(一)

前言 在做實驗時需要用到faster-rcnn做對比,本節首先完成代碼復現,用的數據集是VOC2007~ 項目地址:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 復現環境:autodl服務器+python3.6+cuda11.3+Ubuntu20.04+Pytorch1.10.0 目錄 一、環境配置二、編譯cud…

2024年軟考總結 信息系統管理師

選擇題 英文題&#xff0c;我是一題也沒把握&#xff0c;雖然我理解意思。 千萬不要認為考死記硬背不對。目的不在于這。工程項目中有很多重要的數字&#xff0c;能記住說明你合格。 案例 幾乎把答案全寫在案例中了。 計算題 今年最簡單。沒有考成本。 只考了關鍵路徑&a…

頭歌OpenGauss數據庫-I.復雜查詢第8關:兩門及以上課程不及格的學生

任務描述 本關任務:根據提供的表和數據,查詢兩門及其以上不及格課程的同學的學號(s_id)、姓名(s_name)及其平均成績(avg_score),要求計算平均成績后為整數。 student表數據: s_ids_names_sex01Mia女02Riley男03Aria女04Lucas女05Oliver男06Caden男07Lily女08Jacob男c…

安卓開發:相機水印設置

1.更新水印 DecimalFormat DF new DecimalFormat("#"); DecimalFormat DF1 new DecimalFormat("#.#");LocationManager LM (LocationManager)getSystemService(Context.LOCATION_SERVICE); LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2…

【學習筆記】計算機組成原理(七)

指令系統 文章目錄 指令系統7.1 機器指令7.1.1 指令的一般格式7.1.2 指令字長 7.2 操作數類型和操作類型7.2.1 操作數類型7.2.2 數據在存儲器中的存放方式7.2.3 操作類型 7.3 尋址方式7.3.1 指令尋址7.3.1.1 順序尋址7.3.1.2 跳躍尋址 7.3.2 數據尋址7.3.2.1 立即尋址7.3.2.2 直…

第四十五天 | 322.零錢兌換

題目&#xff1a;322.零錢兌換 嘗試解答&#xff1a; 1.確定dp[j]含義&#xff1a;裝滿容量為j的背包所需要放的硬幣個數為dp[j]; 2.動態轉移方程&#xff1a;dp[j] dp[j - coins[i]] 1; 3.遍歷順序&#xff1a;本題應該為組合類題目&#xff0c;不考慮裝入的順序&#x…

精品PPT | 精益生產管理中MES系統的實現與應用(免費下載)

【1】關注本公眾號&#xff0c;轉發當前文章到微信朋友圈 【2】私信發送 MES系統的實現與應用 【3】獲取本方案PDF下載鏈接&#xff0c;直接下載即可。 如需下載本方案PPT/WORD原格式&#xff0c;請加入微信掃描以下方案驛站知識星球&#xff0c;獲取上萬份PPT/WORD解決方案&…

吃掉 N 個橘子的最少天數(Lc1553)——記憶化搜索

廚房里總共有 n 個橘子&#xff0c;你決定每一天選擇如下方式之一吃這些橘子&#xff1a; 吃掉一個橘子。如果剩余橘子數 n 能被 2 整除&#xff0c;那么你可以吃掉 n/2 個橘子。如果剩余橘子數 n 能被 3 整除&#xff0c;那么你可以吃掉 2*(n/3) 個橘子。 每天你只能從以上 …

Redis - 緩存場景

學習資料 學習的黑馬程序員嗶站項目黑馬點評&#xff0c;用作記錄和探究原理。 Redis緩存 緩存 &#xff1a;就是數據交換的緩沖區&#xff0c;是存儲數據的臨時地方&#xff0c;讀寫性能較高 緩存常見的場景: 數據庫查詢加速&#xff1a;通過將頻繁查詢的數據緩存起來&…

【挖金子game】

如果您想要編寫一個簡單的“挖金子”游戲代碼&#xff0c;可以使用Python這樣的編程語言來實現。以下是一個簡單的Python代碼示例&#xff0c;用于創建一個基本的“挖金子”游戲&#xff1a; import random # 游戲設置 max_gold 10 # 最大金子數量 max_digs 5 # 最大挖掘…