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

时间:2011-11-24 22:51:10

标签: java .net design-patterns memory language-agnostic

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

此外,像java.awt.RenderingHints.Key这样的POJO经常使用每个唯一不可变的一个实例设计模式:

  
    

此类的实例是不可变且唯一的,这意味着可以使用==运算符而不是更昂贵的equals()方法进行匹配测试。

  

我可以通过这种方法了解速度提升,

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

3 个答案:

答案 0 :(得分:1)

有时称为Flyweight模式,特别是如果可能对象的空间有界。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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