不可變類和快取例項的不可變類
阿新 • • 發佈:2019-01-07
Java中的Integer類就採用了與CacheImmutale類相同的處理策略,如果採用new構造器來建立物件,則每次返回都是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); } }