一、不可變類(immutable):建立該類實例後,該類的實例變量是不可改變的java
二、Java提供的8個包裝類和java.lang.String類都是不可變類,當建立他們的實例後,其實例的實例變量都是不可改變的。post
三、建立自定義不可變類的原則:this
.一、使用private和final修飾該類的成員變量code
.二、提供帶參數的構造器,用來根據傳入參數初始化類裏的成員變量對象
.三、僅爲該類的成員變量提供getter方法,不要提供setter方法,由於普通方法不能修改final修飾的成員變量blog
.四、若是有必要,重寫Object類的equals()方法,hashCode()方法,equals()方法根據關鍵成員變量來做爲兩個對象相等的標準,get
還應該保證,用equals()方法判斷相等的對象的hashcode()也相等hash
以下代碼示例:table
class Address{ //-使用private和final修飾該類的成員變量 //---不可變類:一要素 private final String detail; private final String postCode; public Address(){ //-賦值 就不可再變 this.detail=""; this.postCode=""; } //-提供帶參數的構造器,用來根據傳入參數初始化類裏的成員變量 //---不可變類:二要素 public Address(String detail,String postCode){ //-賦值 就不可再變 this.detail=detail; this.postCode=postCode; } //-僅爲該類的成員變量提供getter方法,不要提供setter方法,由於普通方法不能修改final修飾的成員變量 //---不可變類:三要素 public String getDetail(){ return this.detail; } public String getPostCode(){ return this.postCode; } //-若是有必要,重寫Object類的equals()方法,hashCode()方法 //-equals()方法根據關鍵成員變量來做爲兩個對象相等的標準 //-還應該保證,用equals()方法判斷相等的對象的hashcode()也相等 //---不可變類:四要素 public boolean equals(Object obj){ if(this==obj){ return true; } if(obj!=null&&obj.getClass()==Address.class){ Address add = (Address)obj; if(this.getDetail().equals(add.getDetail())&&this.getPostCode().equals(add.getPostCode())){ return true; } } return false; } //-重寫 hashCode() 方法 public int hashCode(){ return this.detail.hashCode()+this.postCode.hashCode()*31; } } public class AddressEquals{ public static void main(String[] args){ Address add1 = new Address("北京市","100010"); Address add2 = new Address("北京市","100010"); Address add3 = new Address(); Address add4 = new Address("北京市","100011"); System.out.println(add1.equals(add2)); System.out.println(add1==add2); System.out.println(add1.equals(add3)); System.out.println(add1.hashCode()); System.out.println(add2.hashCode()); System.out.println(add3.hashCode()); System.out.println(add1.hashCode()==add2.hashCode()); } }
運行結果以下:class