支援非可變性

2021-05-21 18:27:25 字數 1227 閱讀 5463

概念:乙個非可變性的類是乙個簡單的類,每個例項包括的資訊都是他在被建立的時候就提供出來的,並且在物件的生命週期內不是不能更改的。這樣的類如:string,biginteger等等。為什麼會有這樣的類呢?他們包含了優雅的設計思想:簡單,不可變,穩定。

其實有點很提倡使用非可變類,但是不一定非要使用。

下面建立乙個優雅的非可變類的5點:

1.不要提供任何可以修改物件的方法。

2.保證沒有可以被子類修改的方法。可以把方法都修飾成final當然還有其他辦法,下面會提到。

3.所有的域都是final的。

4.所有的域都是私有的。

5.保證對任何可變元件的互斥訪問。其實這個話的意思就是你的非可變類中有域指向可變的引用,你應該讓這個引用不要被修改,也就是不要讓客戶**來修改這個引用。並且不要用客戶的物件來初始化你的非可變類。

/***

*//**

* 非可變性的類,表示複數的類

* @author jayd**/

public class complex

public float realpart()

public float imaginarypart()

public complex add(complex c)

public complex subtract(complex c)

public complex multiply(complex c)

public complex divide(complex c)

public int hashcode()

public boolean equals(object obj)

}這些複數類提供的加減乘除的方法,這些方法每次都是建立新的例項。一般非可變類都是採用這樣的模式。在運算中不去改變他的域的值或是引用。

非可變類具體好處:比較簡單,每個物件乙個狀態,都是在建立的時候就給定了的。

非可變類是執行緒安全的,他們不需要被安全同步。因為他們的域是不可能改變的,都是在建立的時候就給定了。所以非可變物件是可以被多個執行緒共享的。但是在這裡,我們就發現我們可能在實際中會使用到很多重用的例項物件,我們可以使用靜態儲存區把他們放進去快取起來。我也可以學習biginteger和boolean類的做法,提供乙個靜態工廠方法可以做到單例或是快取的作用。

非可變類的乙個比較多的應用就是用來給其他類提供大量構件的服務。比如說map的常量類,這個估計做過系統的人都知道,就是把一些常量定義起來在乙個類中。但是非可變類唯一的缺點就是每次都要例項新的物件。

關於不可變性與可變性的「巢狀」聯想

先給出定義 先申述乙個概念 變數 引用 值 也就是 該變數初始化的記憶體 可變性與不可變性 引用可變與否,值可變與否。值的可變性取決於 值的型別是否是可變的,這取決於建立該值的類是否可變。而引用的可變性取決於 該變數命名時是否字首有 final 那麼對於乙個物件而言,其不可變性的程度 是什麼?乙個物...

共性和可變性分析

考慮設計中什麼應該是可變的。這種方法與關注引起重新設計的原因剛好相反。它不是考慮什麼會迫使設計發生改變,而是考慮什麼能夠在不引起重新設計的前提下改變。這時主要關注的就是對變化的概念進行封裝,這時許多設計模式的主題。如何在問題領域中找到不同變化,如何找到不同領域中的共同點。找到變化的地點,稱為 共性分...

Rust RefCell和內部可變性

rust在編譯階段會進行嚴格的借用規則檢查,規則如下 即在編譯階段,當有乙個不可變值時,不能可變的借用它。如下 所示 fn main 會產生編譯錯誤 error e0596 cannot borrow immutable local variable x as mutable src main.rs...