Интерфейс тегов для синглетонов - PullRequest
2 голосов
/ 29 августа 2009

«Синглтон-несс» класса является важным аспектом того, как должен использоваться класс. Тем не менее, он обычно не имеет какого-либо явного статуса в открытом API класса. Да, обычные имена методов, такие как getInstance (), часто используются, но это не совсем то, о чем я здесь говорю.

«Интерфейс тега» - это интерфейс, который не содержит методов или данных. Пример интерфейса тега: Сериализуемый .

Не будет ли полезно определить интерфейс тегов для синглетонов? Это будет:

  • позволяют легко их идентифицировать в кодовой базе проекта
  • быть более явным
  • предоставить место для документирования того, как следует обращаться с одиночками. В качестве одного примера можно упомянуть, что долгоживущие объекты являются плодотворными источниками утечек памяти и что синглтоны никогда не следует подключать к недолговечным объектам.

Это простая идея, но я никогда не видел, чтобы она упоминалась где-либо.

Ответы [ 4 ]

2 голосов
/ 29 августа 2009

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

Проблема в том, что синглтоны стали противоречивыми, потому что они подвержены злоупотреблениям. Люди, выступающие против их использования, указывают на секретное глобальное состояние, скрытые зависимости и массовое злоупотребление.

Ничто из этого, конечно, на самом деле не присуще понятию Singleton-ness, но это не меняет противоречия.

Вашему делу здесь не помогает использование Serializable, потому что, как отмечает Том, это само по себе противоречиво. Конечно, тот факт, что Serializable считается ошибкой некоторых авторов, не обязательно делает это так. Лично я им не пользуюсь, но не потому, что я думаю, что это само по себе ошибка ... Я просто нахожу, что есть лучшие способы сохранить и восстановить состояние, которое лучше соответствует потребностям моих пользователей.

Конечно, если есть память, существуют и другие интерфейсы маркеров - Cloneable, EventThreadListener и SingleThreadModel. Вы могли бы пойти дальше, если бы использовали их в качестве модели.

Между прочим, я думаю, что большинство авторов ссылаются на то, что вы называете «интерфейсом тега», как «интерфейсом маркера». Ничего страшного, но это может помочь вам найти другие мысли на эту тему.

1 голос
/ 29 августа 2009

Это интересная идея, но я не уверен, насколько она полезна. Ваш третий пункт - это хороший момент.

Лучшим аргументом может быть "Почему синглтоны?" Google Singleton Detector наверняка облегчит вам жизнь, чтобы найти и идентифицировать их для уничтожения. Их часто задаваемые вопросы могут выразить мое мнение подробно.

0 голосов
/ 30 августа 2009

Я согласен с TrueWill выше относительно использования инфраструктуры DI для обработки жизненных циклов объектов. А использование Guice даст вам аннотацию Singleton для маркировки сингтонов. :)

0 голосов
/ 29 августа 2009

Почему бы не использовать Контейнер DI / IoC и позволить ему управлять временем жизни ваших объектов? Как вы говорите, время жизни класса не должно отражаться в его открытом интерфейсе.

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