国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Java 中如何實現一個像 String 一樣不可變的類?

開發 前端
我們思考一下,上面的代碼是否真正的做到了不可變,好,我們思考三秒鐘,心里默默的數三下。

如果問你在日常開發中用到的最多的一個 Java? 類是什么,阿粉敢打賭絕對是 String.class?。說到 String? 大家都知道 String 是一個不可變的類;雖然用的很多,那不知道小伙伴們有沒有想過怎么樣創建一個自己的不可變的類呢?這篇文章阿粉就帶大家來實踐一下,創建一個自己的不可變的類。

特性

在手動編寫代碼之前,我們先了解一下不可變類都有哪些特性,

定義類的時候需要使用final? 關鍵字進行修飾:之所以使用 final 進行修飾是因為這樣可以避免被其他類繼承,一旦有了子類繼承就會破壞父類的不可變性機制;

成員變量需要使用fina?l 關鍵詞修飾,并且需要是 private 的:避免屬性被外部修改;

成員變量不可提供setter? 方法,只能提供 getter 方法:避免被外部修改,并且避免返回成員變量本身;

提供所有字段的構造函數;

實操

知道了不可變類的一些基本特性之后,我們來實際寫代碼操作一下,以及我們會驗證一下,如果不按照上面的要求來編寫的話,會出現什么樣的問題。

這里我們定義一個 Teacher? 類來測試一下,按照我們上面提到的幾點,我們給類和屬性的定義都加上 final 代碼如下所示。

package com.example.demo.immutable;

import java.util.List;
import java.util.Map;

public final class Teacher {
private final String name;
private final List<String> students;
private final Address address;
private final Map<String, String> metadata;

public Teacher(String name, List<String> students, Address address, Map<String, String> metadata){
this.name = name;
this.students = students;
this.address = address;
this.metadata = metadata;
}

public String getName(){
return name;
}


public List<String> getStudents(){
return students;
}

public Address getAddress(){
return address;
}

public Map<String, String> getMetadata(){
return metadata;
}
}
package com.example.demo.immutable;

public class Address {
private String country;
private String city;

public String getCountry(){
return country;
}

public void setCountry(String country){
this.country = country;
}

public String getCity(){
return city;
}

public void setCity(String city){
this.city = city;
}
}

我們思考一下,上面的代碼是否真正的做到了不可變,好,我們思考三秒鐘,心里默默的數三下。為了回答這個問題,我們看下下面的測試代碼。

package com.example.demo;

import com.example.demo.immutable.Address;
import com.example.demo.immutable.Teacher;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* <br>
* <b>Function:</b><br>
* <b>Author:</b>@author Silence<br>
* <b>Date:</b>2022-11-22 21:17<br>
* <b>Desc:</b>無<br>
*/
public class ImmutableDemo {

public static void main(String[] args){
List<String> students = new ArrayList<>();
students.add("鴨血粉絲 1");
students.add("鴨血粉絲 2");
students.add("鴨血粉絲 3");
Address address = new Address();
address.setCountry("中國");
address.setCity("深圳");
Map<String, String> metadata = new HashMap<>();
metadata.put("hobby", "籃球");
metadata.put("age", "29");
Teacher teacher = new Teacher("Java極客技術", students, address, metadata);
System.out.println(teacher.getStudents().size());
System.out.println(teacher.getMetadata().size());
System.out.println(teacher.getAddress().getCity());

// 修改屬性
teacher.getStudents().add("小明");
teacher.getMetadata().put("weight", "120");
teacher.getAddress().setCity("廣州");

System.out.println(teacher.getStudents().size());
System.out.println(teacher.getMetadata().size());
System.out.println(teacher.getAddress().getCity());
}

}

運行的結果如下截圖所示,通過測試我們可以發現,簡單的只添加 final? 關鍵字是不能解決不可變性的,我們當前的 teacher 實例已經被外層修改掉了成員變量。

圖片

為了解決這個問題,我們還需要對我們的 Teacher? 類進行改造,首先我們可以想到的就是需要將 students? 和 metadata? 兩個成員變量不能直接返回給外層,否則外層的修改會直接影響到我們的不可變類,那么我們就可以修改 getter 方法,拷貝一下成員變量進行返回,而不是直接返回,修改代碼如下

public List<String> getStudents(){
return new ArrayList<>(students);
//return students;
}
public Map<String, String> getMetadata(){
return new HashMap<>(metadata);
//return metadata;
}

我們再次運行上面的測試代碼,可以看到這次的返回數據如下,這次我們的 students? 和 metadate? 成員變量并沒有被外層修改掉了。但是我們的 address 成員變量還是有問題,沒關系,我們接著往下看。

圖片

很自然的為了解決 address? 的問題,我們想到了也是進行一個拷貝,再調用 getter? 方法的時候返回一個拷貝對象,而不是直接返回成員變量。那我們就需要改造 Address? 類,將其變成 Cloneable? 的即可,我們實現 接口,然后覆蓋一個 clone 方法,代碼如下

package com.example.demo.immutable;

public class Address implements Cloneable{
...// 省略
@Override
public Address clone(){
try {
return (Address) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}

再修改 Teacher? 的 getAddress 方法

public Address getAddress(){
//return address;
return address.clone();
}

接下來我們再運行一下測試代碼,結果如下,可以看到這次我們的 teacher 實例的成員變量并沒有被修改掉了,至此我們完成了一個不可變對象的創建!

圖片

String 的實現

前面我們看的是自定義實現不可變類的操作,接下來我們簡單看一下 String? 類是如何實現不可變的,通過源碼我們可以看到 String? 也使用了關鍵字 final? 來避免被子類繼承,以及對應存放具體值的成員變量也使用了 final 關鍵字。

圖片

并且對外提供的方法 substring? 也是通過復制的形式對外提供的新的 String 對象。

圖片

圖片

注意阿粉這里的 JDK 版本是 19 所以可能大家版本不一致具體的實現不太一樣,但是本質上都是一樣的。

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2023-09-04 14:28:33

FlarumDiscourse開源

2015-03-16 12:50:44

2013-08-22 10:17:51

Google大數據業務價值

2015-02-11 10:42:48

Apple Watch

2020-12-07 10:10:22

企業文化客戶體驗

2023-04-05 14:19:07

FlinkRedisNoSQL

2016-10-08 00:24:53

httptcp實時

2017-05-22 10:33:14

PythonJuliaCython

2021-09-07 10:29:11

JavaScript模塊CSS

2023-05-23 13:59:41

RustPython程序

2013-12-17 09:02:03

Python調試

2013-12-31 09:19:23

Python調試

2022-12-21 15:56:23

代碼文檔工具

2013-07-26 10:15:29

云計算大數據Hadoop

2020-10-11 21:39:35

計算機互聯網 技術

2017-11-06 14:18:03

2020-08-25 08:56:55

Pythonawk字符串

2020-09-30 17:12:09

人工智能技術數據

2023-02-15 08:17:20

VSCodeTypeScrip

2025-09-12 00:00:00

DevToolsJavaScript調試術
點贊
收藏

51CTO技術棧公眾號

亚洲第一福利社区| 久久久亚洲高清| 亚洲r级在线视频| 国产精品扒开腿做爽爽爽视频| 日本黄色三级大片| 成人国产激情| 久久精品国产在热久久| 亚洲小说欧美另类婷婷| 日韩免费一区二区三区在线播放| 中文精品一区二区三区| 欧美性suv| 国产女主播一区| 国产日韩欧美综合| av每日在线更新| 九九视频精品免费| 久久香蕉国产线看观看av| 韩国av电影免费观看| 亚州av乱码久久精品蜜桃| 91麻豆精品国产无毒不卡在线观看| 樱花www成人免费视频| www.欧美视频| 欧美日韩免费在线| 日本一区二区久久精品| 99亚洲男女激情在线观看| 一区二区三区日本| 日本成人黄色免费看| 精品三级国产| 欧美性色欧美a在线播放| av免费看网址| 精品高清在线| 日韩av网址在线观看| 99热最新网址| 久久五月激情| 97色在线视频观看| 日韩123区| 欧美一区二区美女| 欧美成人免费在线| 91精品国产欧美一区二区| 欧美日韩激情一区| 欧美sm极限捆绑bd| 亚洲欧美日韩第一区| 日韩中文字幕精品视频| 国产精品乱码妇女bbbb| 国产精品久久夜| 亚洲愉拍自拍另类高清精品| 天天综合天天做天天综合| 欧美视频日韩视频在线观看| 精品区一区二区| 亚洲午夜av久久乱码| 久久久国产一区二区| 91成人国产在线观看| 成人在线视频网站| 欧美xxxx黑人又粗又长密月| 最新欧美日韩亚洲| 久久久久久久久久久久久国产精品| 成人伦理视频网站| 韩国中文免费在线视频| 欧美aaa免费| 亚洲国产aⅴ精品一区二区三区| 国产精品天天看天天狠| 天天精品视频| 天堂va蜜桃一区二区三区漫画版| 国产成人亚洲精品狼色在线| 国产精品人妖ts系列视频| 欧美性猛交xxx| 亚洲第一页中文字幕| 久热国产精品视频| 国产日产亚洲精品| 亚洲电影网站| 99热手机在线| 国产私人尤物无码不卡| 天堂中文在线播放| 欧美人妖在线观看| 亚洲精品孕妇| av网站免费线看精品| 午夜久久久久久久久久一区二区| 精品欧美久久久| 欧美肥臀大乳一区二区免费视频| 成人a在线观看| 一本一道久久a久久精品综合| 日本成人在线免费视频| 色在线免费视频| 欧美日韩免费看片| 欧美精品一区二区三区精品| 美女精品在线观看| 欧美激情中文不卡| 欧美性一二三区| 日韩在线观看高清| 91免费电影网站| 成年丰满熟妇午夜免费视频| 美女视频黄a视频全免费观看| 日本无删减在线| 免费看成人人体视频| 亚洲影院一区| 中文字幕不卡在线观看| 成人羞羞国产免费网站| 亚洲成人最新网站| 国产精品亚洲不卡a| 国产综合久久久久影院| 欧美日韩精品在线一区二区 | 中文字幕一区二区精品区| 日韩av电影在线网| 欧洲午夜精品| 中文字幕一区二区精品| 妖精视频一区二区三区| 91看片就是不一样| 亚洲女人****多毛耸耸8| 中文字幕毛片| 亚洲热线99精品视频| 亚洲精品网址| 99一区二区| 日本sm残虐另类| h七七www色午夜日本| 这里只有精品99re| 在线观看美女网站大全免费| 91麻豆精品国产自产在线| 成人影院在线观看| 日韩欧美久久一区| 蜜臀av国内免费精品久久久夜夜| 91国产免费观看| 国产理论在线| 久久精品2019中文字幕| 韩日成人在线| 欧美a级免费视频| 欧美久久免费观看| 日韩电影精品| 国产综合色香蕉精品| 亚洲91视频| 精品国产一区二区三区在线| 亚洲日穴在线视频| 涩涩视频网站在线观看| 亚洲天堂av图片| 51亚洲精品| 欧美日韩在线精品一区二区三区| 欧美无人高清视频在线观看| 欧美暴力喷水在线| 四虎黄色影院| 日韩欧美在线1卡| 成人看的羞羞网站| av观看免费在线| 国产精品日产欧美久久久久| 欧美综合影院| 欧美美乳视频网站在线观看| 亚洲一级二级三级| a成人v在线| 视频一区二区精品| 亚洲一区二区三区中文字幕在线| 老司机福利在线视频| 久久91精品国产| 亚洲精品精选| 婷婷五月综合缴情在线视频| 亚洲精品动漫100p| 亚洲性人人天天夜夜摸| www.男人天堂网| 欧美亚洲自拍偷拍| 亚洲精品影片| www.日本三级| 日韩欧美一区在线观看| 欧美日韩国产探花| 免费av片在线观看一道本| 91精品国产91久久久久久| 丰满亚洲少妇av| 日本不卡网站| 国产在线不卡精品| 26uuu精品一区二区在线观看| 国产福利电影在线播放| 国产精品免费观看久久| 亚洲小说区图片区都市| 亚洲乱码电影| 一区二区视频在线看| 欧美成人激情视频免费观看| 手机成人av在线| av免费在线观| 99在线观看免费视频精品观看| 狠狠做深爱婷婷久久综合一区| 国产aaa精品| www.4438全国最大| 美国一区二区| 国产精品三级久久久久三级| 免费99精品国产自在在线| 999在线观看视频| 国产经典一区| 国产成人av网站| 亚洲欧美综合图区| 日韩精品一区二区三区电影| 欧美a级在线观看| 久久99最新地址| 亚洲国产精久久久久久久| 日韩视频在线观看国产| 中文字幕有码在线视频| 久久久一二三| 日韩三级视频中文字幕| 秋霞毛片久久久久久久久| 国产精品va在线观看视色 | av在线亚洲一区| 成人精品视频一区二区三区尤物| 尤物九九久久国产精品的特点| 日韩精品在线中文字幕| 欧美成人黑人| 99在线精品一区二区三区|