Является ли шаблон проектирования «один экземпляр на уникальную неизменяемость» злым? - PullRequest
1 голос
/ 25 ноября 2011

Я читал главу об эффективной Java, в которой говорится о преимуществах сохранения только одного экземпляра неизменяемого объекта, так что мы можем проводить сравнение идентификаторов объектов x == y вместо сравнения значений для идентичности.

Кроме того, POJO, такие как java.awt.RenderingHints.Key, часто используют шаблон проектирования «один экземпляр на уникальную неизменяемая»:

Экземпляры этого класса являются неизменяемыми и уникальными, что означает, что тесты на совпадения могут быть выполнены с использованием оператора == вместо более дорогого метода equals ().

При таком подходе я могу понять увеличение скорости,

Но не приведет ли этот шаблон проектирования к утечке памяти?

Ответы [ 3 ]

1 голос
/ 25 ноября 2011

Это иногда называют шаблоном Flyweight, особенно если пространство возможных объектов ограничено.

1 голос
/ 26 ноября 2011

Да, это может привести к росту памяти (это не утечка, если это преднамеренное поведение). Будет или нет, зависит только от того, как указан контракт уникальности. Например, если вы сериализуете один из этих объектов на диск, выходите из области, в которой он существует, и затем десериализуете его обратно с диска, происходит одно из двух: либо вы получаете один и тот же объект, либо вы получаете другой. Если вы получаете один и тот же объект, то каждый объект, который использовался в жизни JVM, должен быть сохранен, и у вас будет рост памяти. Если вы получаете другой объект, тогда объекты должны существовать только при наличии ссылки на них, и у вас не будет роста памяти.

0 голосов
/ 25 ноября 2011

Что касается реализации кэша, вы можете выбрать http://docs.oracle.com/javase/6/docs/api/java/util/WeakHashMap.html или вы можете использовать ограниченный кэш LRU.

...