不可變類(一):

一、不可變類(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

相關文章
相關標籤/搜索