Есть ли способ, которым я могу сохранить состояние "статических членов"? - PullRequest
9 голосов
/ 11 июля 2011

Точно так же, как способ сохранения instance variables с использованием сериализации, есть ли способ сохранить состояние членов static?

Если возникает ситуация, когда для восстановления чего-либо необходимо вернуть состояние статических элементов, как это можно сделать?

1 Ответ

12 голосов
/ 11 июля 2011

Самый простой вариант, который приходит мне в голову, это использовать singleton вместо статических полей.Одноэлементный объект может быть сериализован и десериализован, и вы можете управлять его временем жизни, сохраняя при этом «глобальное состояние», которое дают вам статические поля (при этом глобальное состояние - это плохо, но это другая тема)

В противном случае - статическое состояние сохраняется в течение всего времени жизни загрузчика классов (что обычно означает время жизни JVM).Поэтому, если вы хотите сохранить состояние, имеет смысл сделать это при завершении работы и восстановить его при загрузке класса.

  • Runtime.addShutdownHook(..) для выполнения сериализации при завершении работы
  • используйтеstatic {..} блок для загрузки при следующем открытии

Формат сериализации может быть любым.JSON, BSON, Java-сериализация (с использованием ObjectOutputStream)

Но это необычно и в большинстве случаев неправильно.Поэтому убедитесь, что это то, что вы хотите.Если вы просто хотите, чтобы состояние сохранялось на протяжении всего жизненного цикла приложения, ничего не делайте.А если вы хотите сохранить что-то дольше, выберите опцию singleton или рассмотрите возможность использования небольшой базы данных, а не статических полей.

...