6.4.8 缓存实例的不可变类

来源:互联网 发布:linux shell 编辑:程序博客网 时间:2024/05/22 17:23
package chap6_4;import javax.swing.CellEditor;class CacheImmutale{    private static int MAX_SIZE=10;    private static CacheImmutale[]cache=new CacheImmutale[MAX_SIZE];    private static int pos=0;    private final String name;    public CacheImmutale(String name) {        // TODO Auto-generated constructor stub        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{            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");        System.out.println(c1==c2);    }}

运行结果

true

该类共可以缓存MAX_SIZE个CacheImmutale对象。

是否需要隐藏CacheImmutale类的构造器完全取决于系统需求,盲目乱用缓存也可能导致系统性能下降,缓存的对象会占用系统内存,如果某个对象只使用一次,重复使用的概率不大,缓存该实例就弊大于利;反之,如果某个对象需要频发的重复使用,缓存该实例就利大于弊。

package chap6_4;public class IntegerCacheTest {    public static void main(String[] args) {        // TODO Auto-generated method stub        Integer in1=new Integer(6);        Integer in2=Integer.valueOf(6);        Integer in3=Integer.valueOf(6);        System.out.println(in1==in2);        System.out.println(in2==in3);        Integer in4=Integer.valueOf(200);        Integer in5=Integer.valueOf(200);        System.out.println(in4==in5);    }}
0 0
原创粉丝点击