7、缓存、不可变类

来源:互联网 发布:java模板引擎 编辑:程序博客网 时间:2024/05/22 16:14

不可变类的实例不可改变(变量全是private,只有getter没有setter),这种类的实例经常被多个对象使用,所以做成缓存可以提高性能。

class cacheImmu{private static int MAX_SIZE = 10;private static int pos = 0;//当前将要存放的位置private static cacheImmu[] cache = new cacheImmu[MAX_SIZE];private final String name;private cacheImmu(String name){this.name = name;}public static cacheImmu createImmutale(String name){for(int i = 0; i<MAX_SIZE; i++){if(cache[i] != null && cache[i].name.equals(name))//检查是否已经存在同名实例{return cache[i];}}if(pos == MAX_SIZE)//如果pos=10即表示0到9已存满,所以从0开始从头覆盖{pos = 0;}cache[pos++] = new cacheImmu(name);return cache[pos - 1];}public boolean equals(Object obj){if(this == obj){return true;}if(obj != null && obj.getClass() == cacheImmu.class){cacheImmu cachetemp = (cacheImmu)obj;return this.name.equals(cachetemp);}return false;}public int hashCode(){return name.hashCode();}}public class CacheImmutale{public static void main(String[] args){cacheImmu c1 = cacheImmu.createImmutale("immu1");cacheImmu c2 = cacheImmu.createImmutale("immu1");System.out.println(c1 == c2);}}

结果输出true,c1和c2引用(指向)的是同一个实例。

这个类只有一个变量name,即是唯一的标识。

要注意一些细节:首先,判断是否已经存在相同name的实例时,必须判断cache[i]是否为空,而且必须用短路的与(&&)因为在第一次存满之前都是空的,如果为空则执行

cache[i].name.equals(name)
会出错。


最开始写了一个错误的

<pre name="code" class="java">class cacheImmutale{private static int MAX_SIZE = 10;private static int pos = 0;private static cacheImmutale[] cache = new cacheImmutale[MAX_SIZE];private final String name;private cacheImmutale(String name){this.name = name;}public static cacheImmutale createImmutale(String name){for(int i = 0; i<MAX_SIZE; i++){if(name == cache[i].name){return cache[i];}}this(name);pos++;}}

就是没有判断cache[i]是否为空。同时

if(name == cache[i].name)
也是不可以的,这里要判断的是字符串是否一样,应该用equals。


第二个问题是

<span style="font-family: Arial, Helvetica, sans-serif;">this(name);</span>

错误提示告诉我,用this()来调用自己的构造器,只能在另一个构造器中的第一行。而且单单写一个this(name),没有返回实例,也是没用的。


0 0
原创粉丝点击