缓存实例的不可变类:

来源:互联网 发布:ios数组动态添加元素 编辑:程序博客网 时间:2024/05/18 00:12

可变类的实例状态不可改变,可以很方便的被多个对象所共享,如果程序要经常使用相同的不可变类实例,则应该考虑缓存这种不可变的实例。因为重复创建相同的对象无太大的意义,会加大系统开销。缓存是软件设计中一个非常有用的模式。

下面程序将使用一个数组作为缓存池:

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 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设为0        }        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);    }}
0 0