不可变类(一):

1、不可变类(immutable):创建该类实例后,该类的实例变量是不可改变的

2、Java提供的8个包装类和java.lang.String类都是不可变类,当创建他们的实例后,其实例的实例变量都是不可改变的。

3、创建自定义不可变类的原则:

  .1、使用private和final修饰该类的成员变量

  .2、提供带参数的构造器,用来根据传入参数初始化类里的成员变量

  .3、仅为该类的成员变量提供getter方法,不要提供setter方法,因为普通方法不能修改final修饰的成员变量

  .4、如果有必要,重写Object类的equals()方法,hashCode()方法,equals()方法根据关键成员变量来作为两个对象相等的标准,

    还应该保证,用equals()方法判断相等的对象的hashcode()也相等

如下代码示例:

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());
	}
}

 运行结果如下:

posted on 2017-12-23 16:45  不丶懂  阅读(608)  评论(0编辑  收藏  举报

导航