Как создать истинный одиночный элемент в Java?

Удостоверьтесь, что Вы резервируете код тега (или еще лучше резервируете немного в каждом теге), который определяет, удалил/освободил блок/блок. Блоки могут тогда быть удалены путем простого изменения текущего кода тега блока на удаленный код тега или устанавливают удаленный бит тега. Таким образом, Вы не должны сразу же полностью реструктурировать свой файл при удалении блока.

Резервирование немного в теге предоставляет возможность возможного восстановления после удаления блока (если Вы оставляете данные блока без изменений).

Для безопасности, однако Вы могли бы хотеть обнулить данные удаленного блока, в этом случае Вы будете использовать специальное предложение, удалил/освободил тег.

я соглашаюсь с Stepan, что необходимо выбрать порядок байтов, но у меня также был бы индикатор порядка байтов в файле. При использовании индикатора порядка байтов, Вы могли бы рассмотреть использование одного из , Порядок байтов UniCode отмечает также как inidicator любого текстового кодирования UniCode, используемого для любых текстовых блоков. BOM обычно является первыми несколькими байтами текстовых файлов UniCoded, поэтому если Ваш BOM является первой записью в Вашем файле могла бы быть проблема некоторой утилиты, идентифицирующей Ваш файл как текст UniCode (я не думаю, что это - очень проблема). Я рассматривал бы/резервировал бы BOM как один из Ваших нормальных тегов (использующий или UTF16 BOM при использовании тегов на 16 битов или UTF32 BOM при использовании тегов на 32 бита) с 0 блоками/блоками длины.

См. также http://en.wikipedia.org/wiki/File_format

5
задан Bill the Lizard 9 August 2011 в 20:17
поделиться

3 ответа

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

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

5
ответ дан 18 December 2019 в 14:48
поделиться

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

Например, в JBoss вы можете использовать дескриптор xyz-service.xml для настройки одноэлементного объекта, который висит на JNDI или JMX дереве, и ваши компоненты приложения (например, ваши EJB) будут выбирать одноэлементный объект из дерева. Это в некоторой степени защищает вас от базовой семантики загрузчика классов.

5
ответ дан 18 December 2019 в 14:48
поделиться

J2EE разработан с учетом кластеризации, поэтому любые проекты, которые он поддерживает, должны будут работать с несколькими JVM. Я понимаю из вашего вопроса, что вас не беспокоит кластерная среда, поэтому простая вставка в JNDI на вашем сервере приложений должна сделать это. В Glassfish это называется слушателем жизненного цикла . Даже после запуска вставьте свой синглтон в JNDI, а затем пусть все остальные выполнят поиск по JNDI, чтобы найти его.

Обратите внимание, что GlassFish все еще может вас здесь испортить, поскольку он может сериализовать класс в JNDI, в результате чего вы получите разные экземпляры. Я сомневаюсь, что он действительно делает это в пределах одной JVM, но вы не узнаете, пока не попробуете.

Реальный ответ сводится к тому, что J2EE враждебен глобальному истинному синглтону, а способ решения проблемы J2EE заключается в переосмыслении решения. Что-то вроде базы данных для хранения значений или какой-либо другой внешней службы, которая может гарантировать, что существует только один экземпляр данных (даже если существует несколько экземпляров объектов, представляющих данные), - это способ J2EE.

3
ответ дан 18 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: