不可变类(一):
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()); } }
运行结果如下:
热心技术,并兼吃喝,偶谈风月,不言国事.