首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

缓存范例的不可变类

2012-12-20 
缓存实例的不可变类???? 不可变类的实例的状态不可改变,可以很方便地被多个对象所共享,如果程序经常需要使

缓存实例的不可变类

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

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

?

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

?

热点排行