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