`
kxl8368
  • 浏览: 2388 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

final修饰符的一些用法以及不可变类Immutable

阅读更多

先贴上代码,照着教材敲的,给一些自己觉得需要理解的地方加上了注释。

//**************************************************************
//
// 本程序是关于“不可变类”的学习实例,通过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;
	}

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics