Java 基础系列:不变性
1.1定義
不可變類(Immutable Objects):當類的實例一經創建,其內容便不可改變,即無法修改其成員變量。
可變類(Mutable Objects):類的實例創建后,可以修改其內容。
Java 中八個基本類型的包裝類和 String 類都屬于不可變類,而其他的大多數類都屬于可變類。
ps:某個對象在被創建后其狀態就不能被修改,那么這個對象就稱為不可變對象,不可變對象一定是線程安全的。不可變對象很簡單。他們只有一種狀態,并且該狀態由構造函數來控制。
需要特別注意的是,不可變類的不可變是指該類的實例不可變而非指向該實例的引用的不可變。
1.2充分條件
當滿足以下條件時,對象才是不可變的:
(1)對象創建以后其狀態就不能改變;
(2)對象的所有域都是final類型;
(3)對象是正確創造的(在對象創建期間,this引用沒有溢出)。
1.3特征
一個不可變類的定義應當具備以下特征:
所有成員都是 private final 的
不提供對成員的改變方法,例如:setXXXX
確保所有的方法不會被重載。手段有兩種:使用final Class(強不可變類),或者將所有類方法加上final(弱不可變類)。
如果某一個類成員不是基本類型(primitive type)或不可變類,必須通過在成員初始化(in)或者getter方法(out)時通過深度拷貝(即復制一個該類的新實例而非引用)方法,來確保類的不可變。
如果有必要,重寫hashCode和equals方法,同時應保證兩個用equals方法判斷為相等的對象,其hashCode也應相等。
1.4優缺點
1. 優點:效率和安全。
效率(拷貝地址+緩存)
1. 當一個對象是不可變的,那么需要拷貝這個對象的內容時,就不用復制它的本身而只是復制它的地址,復制地址(通常一個指針的大小)只需要很小的內存空間,具有非常高的效率。同時,對于引用該對象的其他變量也不會造成影響。
2.不變性保證了hashCode 的唯一性,因此可以放心地進行緩存而不必每次重新計算新的哈希碼。而哈希碼被頻繁地使用, 比如在hashMap 等容器中。將hashCode 緩存可以提高以不變類實例為key的容器的性能。
線程安全
在多線程情況下,一個可變對象的值很可能被其他進程改變,這樣會造成不可預期的結果,而使用不可變對象就可以避免這種情況同時省去了同步加鎖等過程,因此不可變類是線程安全的。
2. 缺點:不可變類的每一次“改變”都會產生新的對象,因此在使用中不可避免的會產生很多垃圾。
總結
以上是生活随笔為你收集整理的Java 基础系列:不变性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 别克阅朗1.3t精英款适合什么机油?
- 下一篇: 为什么榴莲这么贵?