不可变类(一):
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());
}
}
运行结果如下:

热心技术,并兼吃喝,偶谈风月,不言国事.
浙公网安备 33010602011771号