1. 程式人生 > >不可變類和快取例項的不可變類

不可變類和快取例項的不可變類

class CacheImmutale{
	private static int MAX_SIZE=10;
	//使用陣列來快取例項
	private static CacheImmutale[]cache=new CacheImmutale[MAX_SIZE];
	//記錄快取例項在快取中的位置,cache[pos-1]是最新快取的例項
	private static int pos=0;
	private final String name;
	//程式使用private修飾符來隱藏構造器,是外部無法通過new
	private CacheImmutale(String name){
		this.name=name;
	}
	public String getName(){
		return name;
	}
	public static CacheImmutale valueof(String name){
		//遍歷已快取的物件
		for(int i=0;i<MAX_SIZE;i++){
			if(cache[i]!=null&&cache[i].getName().equals(name)){
				return cache[i];
			}
		}
		//如果快取池已滿
		if(pos==MAX_SIZE){
			//把快取的第一個物件覆蓋掉,即把生成的物件放置到快取池的最開始位置
			cache[0]=new  CacheImmutale(name);
			pos=1;
		}else{
			//把建立起來的物件快取起來,pos+1
			cache[pos++]=new CacheImmutale(name);
		}
		return cache[pos-1];

	}
	public boolean equals(Object obj){
		if(this==obj){
			return true;
		}
		if(obj!=null&& obj.getclass()==CacheImmutale.class){
			CacheImmutale ci=(CacheImmutale)obj;
			return name.equals(ci.getName());
		}
		return false;
	}
	public int hashCode(){
		return name.hashCode();
	}
}
public class CacheImmutaleTest{
	public static void main(String []args){
		CacheImmutale c1=CacheImmutale.valueof("hello");
		CacheImmutale c2=CacheImmutale.valueof("hello");
		//true
		System.out.println(c1==c2);
	}
}
Java中的Integer類就採用了與CacheImmutale類相同的處理策略,如果採用new構造器來建立物件,則每次返回都是