Неизменный класс сохранит память? - PullRequest
0 голосов
/ 12 августа 2011

Приведет ли неизменный класс моей собственной реализации к экономии памяти? То есть, если две ссылки должны ссылаться на идентичные экземпляры, они будут ссылаться на один и тот же экземпляр, даже если есть две отдельные попытки выделить объект. Это вопрос Java.

Ответы [ 3 ]

4 голосов
/ 12 августа 2011

Не неизменность, но ваш дизайн для двух ссылок на один и тот же экземпляр - вот что "экономит" память.Неизменность не зависит от этого решения.

1 голос
/ 12 августа 2011

Во-первых: трудно судить, экономит ли это память, если вы не скажете нам, с чем сравнивать.

Обычно: нет, не автоматически. Неизменяемые классы не сохраняют память автоматически, они могут даже привести к увеличению нагрузки на память, потому что вам нужно создавать новый экземпляр каждый раз, когда вы хотите что-то изменить в этом.

Как говорится, вы можете извлечь из этого некоторую экономию памяти, если вы много делитесь экземплярами: поскольку они неизменны, вы можете избегать создания защитной копии и просто использовать Это. Это может улучшить использование памяти.

Итак, подведем итог: одни неизменяемые классы обычно не используют больше или меньше памяти. Фактическая экономия заключается в том, как вы их используете.

0 голосов
/ 12 августа 2011

Вы путаете понятия.Тот факт, что класс является неизменным, не означает, что вы будете «повторно использовать» предыдущие объекты.

Например, если я сделаю

ImmutableClass myImmu = new ImmutableClass(5);
ImmutableClass myImmu2 = new ImmutableClass(5);

, я создал два разных объекта (даже если ихреализация equals () возвращает true).

Другая вещь - это пул / кеширование, где вы храните список созданных экземпляров и вместо вызова конструктора вы вызываете метод Factory, который может получить ранеекэшированный экземпляр.Неизменяемые классы легче объединять / кэшировать, поскольку их состояние зависит только от конструктора, поэтому вы уверены, что он не изменился.

private static Map<Integer, InmutableClass> pool = ...

public static InmutableClass getInstance(int param) {
  InmutableClass returnValue = pool.get(param);
  if (returnValue == null) {
    returnValue = new InmutableClass(param);
    pool.put(param, returnValue);
  }
  return returnValue;
}

Конечно, если ваши экземпляры редко используются повторно, вы бы прекратили использовать больше памятис этой схемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...