缓存实例的不可变类

     不可变类的实例的状态不可改变,可以很方便地被多个对象所共享,如果程序经常需要使用相同的不可变类的实例,则应该考虑缓存这种不可变类的实例,毕竟多次重复创建相同对象没有太大的意义,而且加大系统开销。如果可以,应该将已经创建的不可变类进行缓存。

    缓存是软件设计中一个非常有用的模式,缓存的实现方式有很多,不同实现方式可能存在较大的性能差别。

 

以下是一个简单的Demo

 

package com.seimma.immutalb;

public class CacheImmutale {
      private final String name;
      private final int age;
      private static CacheImmutale [] cache=new CacheImmutale[10];
      //记录缓存实例在缓存中的位置,chche[pos-1]是最新缓存的实例
      private static int pos=0;
      public CacheImmutale(String name,int age){
            this.name=name;
            this.age=age;
      }
      public String getName() {
            return name;
      }
      public int getAge() {
           return age;
     }
 
     public static CacheImmutale valueOf(String name,int age){
            //遍历已缓存的对象
            for (int i = 0; i < 10; i++) {
                  //如果已有相同的实例,直接返回该缓存的实例
                  if (cache[i]!=null && cache[i].getName().equals(name) && cache[i].getAge()==age) {
                            return cache[i];
                  }
           }
           //如果缓存已满
           if (pos==10) {
                 //把缓存的第一个对象覆盖,即把刚刚生成的对象放在缓存池的最开始位置
                 cache[0]=new CacheImmutale(name,age);
                 pos=1;   //把pos设置为1
                 return cache[0];
          }else {
                //把心创建的对象缓存起来,pos+1
               cache[pos++]=new CacheImmutale(name,age);
               return cache[pos-1];
         }
     }
 
    public boolean equals(Object obj) {
         if (obj instanceof CacheImmutale) {
                   CacheImmutale caImmutale=(CacheImmutale)obj;
                    if (name.equals(caImmutale.getName())) {
                                return true;
                    }
         }
         return false;
    }
     public int hashCode(){
            return name.hashCode();
     }
 
     public static void main(String[] args) {
            CacheImmutale caImmu1=CacheImmutale.valueOf("hello",12);
            CacheImmutale caImmu2=CacheImmutale.valueOf("hello",12);
            //下面代码输出true
            System.out.println(caImmu1==caImmu2);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值