`

缓存实例的不可变类

阅读更多

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

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

 

以下是一个简单的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);
    }
}

 

分享到:
评论

相关推荐

    Java缓存池代码实例详解

    本篇文章主要介绍了Java实现简单的缓存方法实例,需要的朋友可以参考下

    hibernate 3中的缓存小结

    l SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。 l JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。 2.3.5. 配置二级缓存的主要步骤: 1)...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例042 使用可变变量输出“I Like PHP!” 73 实例043 使用转义字符输出特殊字符 74 实例044 使用常量指定PI的值计算圆的面积 75 2.2 运算符 75 实例045 自定义数字的加密/解密算法 76 实例046 比较两个时间戳的大小...

    java范例开发大全

    实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求的方法不存在(NoSuchMethodException) 63 4.3 try…catch捕获异常 65 实例46 try…catch捕获异常的实例 66 实例47 try…catch…finally...

    PHP函数库,PHP函数大全,PHP函数实例,PHP函数手册,PHP5函数库实例

    PHP不缓存数据头 PHP伪造IP PHP全角半角转换函数 PHP农历函数 PHP分页函数 PHP判断字符串是否UTF8格式 php判断爬虫函数 PHP判断远程文件是否存在 PHP图片处理类:缩略,裁剪,圆角,倾斜 PHP多功能图片处理...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例042 使用可变变量输出“I Like PHP!” 73 实例043 使用转义字符输出特殊字符 74 实例044 使用常量指定PI的值计算圆的面积 75 2.2 运算符 75 实例045 自定义数字的加密/解密算法 76 实例046 比较两个时间戳的大小...

    Java范例开发大全 (源程序)

     实例44 找不到指定类时发生的异常(ClassNotFoundException) 62  实例45 请求的方法不存在(NoSuchMethodException) 63  4.3 try…catch捕获异常 65  实例46 try…catch捕获异常的实例 66  实例47 try…...

    java范例开发大全(pdf&源码)

    实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求的方法不存在(NoSuchMethodException) 63 4.3 try…catch捕获异常 65 实例46 try…catch捕获异常的实例 66 实例47 try…catch…finally...

    java范例开发大全源代码

     实例44 找不到指定类时发生的异常(ClassNotFoundException) 62  实例45 请求的方法不存在(NoSuchMethodException) 63  4.3 try…catch捕获异常 65  实例46 try…catch捕获异常的实例 66  实例47 ...

    php文件缓存类汇总

    缓存类是我们开发应用中会常用使用到的功能,下面就来给大家整理几个php文件缓存类了,各个文件缓存类写法不同,但在性能上会有区别,有兴趣测试的朋友可测试一下这些缓存类。 例1 复制代码 代码如下:&lt;?php $fzz ...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java范例开发大全(全书源程序)

    实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求的方法不存在(NoSuchMethodException) 63 4.3 try…catch捕获异常 65 实例46 try…catch捕获异常的实例 66 实例47 try…catch…...

    javaScript实例自学手册486例,附带目录可方便搜索

    javaScript实例自学手册代码,加了个index.html方便搜索 内容如下面的。 1.1 HTML页面反向显示.htm 1.10 定义网页的关键字.htm 1.11 进入页面同时弹出欢迎对话框.htm 1.12 禁止网页另存.htm 1.13 禁止页面加入...

    DELPHI 5编程实例与技巧

    4.4.8 制作可随处拖放的工具栏 116 4.4.9 将菜单项移到菜单栏的最右边 117 4.4.10 运行时控件的移动 117 第5章 键盘和鼠标 119 5.1 键盘事件 119 5.2 鼠标事件 120 5.2.1 常用鼠标事件 120 5.2.2 拖曳事件 120 5.3 ...

    VS2005典型实例源码大全(C#)

    VS2005典型实例大全(C#)源码 &lt;br/&gt;是一个集成了VS2005新功能的源码集,包括... 具有根据HealthMonitoring的设置,验证失败会发送信息到指定邮箱的功能 是学习及应用VS2005不可或缺的一个参照源码

    C#在VS2005下的典型实例源码大全

    C#在VS2005下的典型实例源码大全: 是一个集成了VS2005新功能的源码集,包括... 具有根据HealthMonitoring的设置,验证失败会发送信息到指定邮箱的功能 &lt;br&gt;是学习及应用VS2005不可或缺的一个参照源码

Global site tag (gtag.js) - Google Analytics