effective java(15) 之使可變性最小化
阿新 • • 發佈:2019-02-14
effective java 之使可變性最小化
1、不可變類是例項不能被修改的類。每個例項中包含的所有資訊都必須在建立該例項的時候就提供,並在物件的整個生命週期內固定不變。
例如String、BigInteger和BigDecimal類。不可變類更易於設計、實現和使用。
2、設計不可變類的原則:
1:不要提供任何修改物件狀態的方法。(setter方法)
2:保證類不會被擴充套件,用final修飾類或者是私有化構造器提供公有靜態工廠方法。
3:使所有域都是final的
4:使所有的域都是私有的
5:確保對於任何可變元件的互斥訪問
3、不可變物件本質上是執行緒安全的,它們不要求同步。所以,不可變物件可以被自由的共享。
4、使類成為不可子類化的另一種方法是將類的建構函式私有化,然後提供靜態工廠來產生物件。
5、總之,堅決不要為每個get方法編寫一個相應的set方法。除非有很好的理由也要讓類成為可變的類,否則就應該是不可變的。
對於有些類而言,其不可變性是不切實際的。如果類不能被做成是不可變的,仍然應該是儘可能地限制它的可變性。
降低物件可以存在的狀態數,可以更容易地分析該物件的行為,同時降低出錯的可能性。
因此,除非有令人信服的理由要使域變成是非final的,否則要使每個域都是final的。
1、不可變類是例項不能被修改的類。每個例項中包含的所有資訊都必須在建立該例項的時候就提供,並在物件的整個生命週期內固定不變。
例如String、BigInteger和BigDecimal類。不可變類更易於設計、實現和使用。
2、設計不可變類的原則:
1:不要提供任何修改物件狀態的方法。(setter方法)
2:保證類不會被擴充套件,用final修飾類或者是私有化構造器提供公有靜態工廠方法。
3:使所有域都是final的
4:使所有的域都是私有的
5:確保對於任何可變元件的互斥訪問
3、不可變物件本質上是執行緒安全的,它們不要求同步。所以,不可變物件可以被自由的共享。
4、使類成為不可子類化的另一種方法是將類的建構函式私有化,然後提供靜態工廠來產生物件。
public class Complex{ private final double re; private final double im; private Complex(double im, double re) { this.im = im; this.re = re; } public static Complex valueOf(double re,double im){ return new Complex(re,im); } }
5、總之,堅決不要為每個get方法編寫一個相應的set方法。除非有很好的理由也要讓類成為可變的類,否則就應該是不可變的。
對於有些類而言,其不可變性是不切實際的。如果類不能被做成是不可變的,仍然應該是儘可能地限制它的可變性。
降低物件可以存在的狀態數,可以更容易地分析該物件的行為,同時降低出錯的可能性。
因此,除非有令人信服的理由要使域變成是非final的,否則要使每個域都是final的。
想要了解更多不變類資訊,請檢視不變模式那節,有詳細的介紹。
每天努力一點,每天都在進步。