每个惟一一个实例的不可变设计模式是否被认为是邪恶的?



我正在阅读关于有效Java的一章,其中讨论了只保留一个不可变对象实例的优点,这样我们就可以进行对象标识比较x == y,而不是比较标识值。

同样,像java.awt.RenderingHints.Key这样的pojo经常使用每个惟一一个实例的不可变设计模式:

该类的实例是不可变且唯一的,这意味着可以使用==操作符来测试匹配,而不是使用更昂贵的equals()方法。

我可以理解这种方法的速度提升,

但是这种设计模式最终不会导致内存泄漏吗?

是的,它可能会导致内存增长(如果这是故意的行为,则不是泄漏)。它是否会取决于唯一性契约是如何指定的。例如,如果将这些对象中的一个序列化到磁盘,退出它存在的作用域,然后从磁盘反序列化它,则会发生两种情况之一:要么得到相同的对象,要么得到不同的对象。如果您获得相同的对象,那么在JVM生命周期中使用的每个对象都需要保留,并且会出现内存增长。如果你得到一个不同的对象,那么对象只需要在有引用的时候存在,你就不会有内存增长。

这有时被称为Flyweight模式,特别是在可能对象的空间是有界的情况下。

关于实现缓存,您可以选择http://docs.oracle.com/javase/6/docs/api/java/util/WeakHashMap.html或者您可以实现有界LRU缓存

最新更新