package com.cache; import java.util.Scanner; public class CacheImmutaleTest { static { System.out.println("输入缓存空间的大小"); Scanner sc = new Scanner(System.in); MAX_SIZE=sc.nextInt(); sc.close(); } private static int MAX_SIZE; private static CacheImmutaleTest[] cache = new CacheImmutaleTest[MAX_SIZE]; private final String name; //pos记录的是当前缓存到的位置; private static int pos; //这里用private是为了只用构造并缓存的方法生成对象 private CacheImmutaleTest(String name){ this.name=name; } private String getName(){ return this.name; } //如果存在一样的对象,则返回该缓存中的实例对象 public static CacheImmutaleTest valueof(String name){ for(int i=0;i<MAX_SIZE;i++){ if(cache[i]!=null&&cache[i].getName()==name){ return cache[i]; } } //如果缓存池满了,则将缓存池中第一个位置覆盖 if(pos==MAX_SIZE){ cache[0]=new CacheImmutaleTest(name); pos=1; System.out.println("缓存池已满,自动覆盖第一个对象"); return cache[0]; } else{ return cache[pos++]= new CacheImmutaleTest(name); } } }
package com.cache; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub CacheImmutaleTest c1 = CacheImmutaleTest.valueof("小明"); CacheImmutaleTest c2 = CacheImmutaleTest.valueof("小明"); CacheImmutaleTest.valueof("小刚"); CacheImmutaleTest.valueof("小红"); CacheImmutaleTest.valueof("小新"); System.out.println(c1==c2); } }
一开始将静态初始化块放在了定义静态成员变量之前,导致了数组下标超出定义范围的异常。可能是因为类初始化时,如果先定义静态变量成员,会指定默认初始值为0导致的错误。