先贴上代码,照着教材敲的,给一些自己觉得需要理解的地方加上了注释。
//**************************************************************
//
// 本程序是关于“不可变类”的学习实例,通过final修饰符修饰类Field
// 使Field值不可修改,从而创建不可变类(Immutable)
//
// 同时,改写了equals方法和hashCode方法,来确保在关键Field值相同
// 的情况下创建的对象也是相同的对象。
//
//**************************************************************
package org.kong.immutableclass;
public class Address
{
//final修饰符修饰的Field,必须显式的初始化,本程序是通过构造方法初始化。
// 不能通过setter方法对其进行赋值,因为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;
}
//这段setter方法会产生编译时错误,因为detail是final变量,本程序已在构造器内进行了
// 初始化,其值将不可被改变。
//publci void setDetail(String detail)
//{
// this.detail = detail;
//}
public String getDetail()
{
return this.detail;
}
public String getPostCode()
{
return this.postCode;
}
public boolean equals(Object obj)
{
if(this == obj)
{
return true;
}
if(obj != null && obj.getClass() == Address.class)
{
//
Address ad = (Address)obj;
//
if(this.getDetail().equals(ad.getDetail()) && this.getPostCode().equals(ad.getPostCode()))
{
return true;
}
}
return false;
}
//重写hashCode()是为了保证自定义类所创建的相同对象的hashcode能够一致
//若不重写,则系统使用Object类的hashCode方法返回值,返回的是Address类对象的hashcode,而实际上应该返回该对象
// 的关键Field的hashCode,才能保证关键Field相同的不同对象是相同的对象。
public int hashCode()
{
return detail.hashCode() + postCode.hashCode()*31;
}
}