不可变类(一):

一、不可变类(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

相关文章
相关标签/搜索