
| JAVA进阶 JAVA中具有实例缓存的不可变类 |
| 摘自: linux.ccidnet.com 被阅读次数: 60 |
由 yangyi 于 2008-06-17 13:07:23 提供 |
不可变类的实例的状态不会变化,这样的实例可以安全地被其他与之关联的对象共享,还可以安全地被多个线程共享。为了节省内存空间,优化程序的性能,应该尽可能地重用不可变类的实例,避免重复创建具有相同属性值的不可变类的实例。 在JDK 1.5的基本类库中,对一些不可变类,如Integer类做了优化,它具有一个实例缓存,用来存放程序中经常使用的Integer实例。JDK 1.5的Integer类新增了一个参数,为int类型的静态工厂方法valueOf(int i),它的处理流程如下: if(在实例缓存中存在取值为i的实例) 在以下程序代码中,分别用new语句和Integer类的valueOf(int i)方法来获得Integer实例。 Integer a=new Integer(10); System.out.println(a==b); //打印false System.out.println(c==d); //打印true 以上代码共创建了3个Integer对象,每个new语句都会创建一个新的Integer对象。而Integer.valueOf(10)方法仅在第一次被调用时,创建取值为10的Integer对象,在第二次被调用时,直接从实例缓存中获得它。由此可见,在程序中用valueOf()静态工厂方法获得Integer对象,可以提高Integer对象的可重用性。 下面的例程,它拥有实例缓存和相应的静态工厂方法valueOf()。Name类的实例缓存中可能会加入大量Name对象,为了防止耗尽内存,在实例缓存中存放的是Name对象的软引用(SoftReference)。如果一个对象仅仅持有软引用,Java虚拟机会在内存不足的情况下回收它的内存。 例程11-12 Name.java import java.util.Set; public class Name { private static final Set public static Name valueOf(String firstname, String lastname){ //静态工厂方法 Iterator while(it.hasNext()){ //如果在缓存中不存在Name对象,就创建该对象,并把它的软引用加入到实例缓存 Name name=new Name(firstname,lastname); } public static void main(String args[]){ Name n1=Name.valueOf("小红","王"); } 在程序中,既可以通过new语句创建Name实例,也可以通过valueOf()方法创建Name实例。在程序的生命周期中,对于程序不需要经常访问的Name实例,应该使用new语句创建它,使它能及时结束生命周期;对于程序需要经常访问的Name实例,那就用valueOf()方法来获得它,因为该方法能把Name实例放到缓存中,使它可以被重用。 |