不可变类的实例的状态不可改变,可以很方便地被多个对象所共享,如果程序经常需要使用相同的不可变类的实例,则应该考虑缓存这种不可变类的实例,毕竟多次重复创建相同对象没有太大的意义,而且加大系统开销。如果可以,应该将已经创建的不可变类进行缓存。
缓存是软件设计中一个非常有用的模式,缓存的实现方式有很多,不同实现方式可能存在较大的性能差别。
以下是一个简单的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);
}
}