| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Singleton, NullPointerException |
| Автор: LLIbIcpEP 9.2.2011, 13:06 | ||||
| Доброго времени суток. Есть синглтон:
Дальше этот синглтон использую хочу использовать так:
Может я чего-то не понимаю, но в юнит-тестах получаю NullPointerException drp почему-то null. Никаких static { } конструкций не юзаю. Логгер (не синглтон, моя обертка к log4j для отложенной обработки строк) работает нормально, хотя объявляется и инициализируется там-же и так-же. log.info("Created EntityManagerFactory"); - отрабатывает. Как так? |
| Автор: Kircul 9.2.2011, 13:11 |
| LLIbIcpEP, стектрэйс в студию. |
| Автор: LLIbIcpEP 9.2.2011, 13:19 | ||||
Config унаследован от Unit. Метод save() в Unit:
Вылетаем при попытке drp.saveUnit(this), drp - null. |
| Автор: LSD 9.2.2011, 14:02 | ||
Есть подозрение что LoggerFilter.getLoggerFilter(Unit.class) вызывает метод save(), а значит он будет вызван до того как будет проинициализирован drp. |
| Автор: LLIbIcpEP 9.2.2011, 14:09 | ||
Да нет, это разные компоненты, функционально не связанные. LoggerFilter - простая обертка для log4j, в которую передаю String format и аргументы, а конкатенация строк и toString() аргументов происходит только если соответствует уровень логов в конфиге. Я в курсе, что slf4j умеет такое из коробки, http://forum.vingrad.ru/forum/topic-321828/kw-maven-weld--servlet-slf.html
Метод save() вызывается в не пустых конструкторах сущностей, если это важно. |
| Автор: LLIbIcpEP 9.2.2011, 15:00 |
| Насколько правильно будет определять drp только в тех методах, где он юзается? Это ведь синглтон, по производительности ударить не должно? |
| Автор: LSD 9.2.2011, 17:10 | ||
| Честно говоря, я вообще не понимаю зачем тут такие сложности. Зачем внутри DataRepositoryProducer объявлять класс DataRepositoryProducerHolder все назначение которого держать ссылку на внешний класс? Тут явно не в том порядке инициализируются поля, отсюда и null. Добавлено через 2 минуты и 56 секунд Если все таки решишь разобраться, что там и как - добавь в каждый класс:
|
| Автор: LLIbIcpEP 9.2.2011, 18:19 | ||||
Это просто такая реализация синглтона.![]() Смена реализации на классический вариант не помогает. ![]() У этой реализации недостаток - нельзя обработать исключения в конструкторе синглтона. Но мне это не надо. Зато есть выгода - нет лишних ифов и synchronized-блоков при поддержке многопоточности и отложенной инициализации, плюс к перфомансу. Добавлено через 9 минут и 26 секунд PS:
|
| Автор: LLIbIcpEP 9.2.2011, 18:38 | ||||||||
Это вообще смешно)
Добавлено через 7 минут и 30 секунд Ага, все стало на свои места. Сделал в синглтоне:
И оставил первое. Выводится следующее:
Юнит инициализируется до статик поля в DataRepositoryProducerHolder. Как бороться? У меня уже чисто спортивный интерес) |
| Автор: _sten_ 9.2.2011, 23:30 |
| а какая JVM? |
| Автор: techmax 10.2.2011, 04:11 | ||
Как вариант:
|
| Автор: LLIbIcpEP 10.2.2011, 17:44 | ||||||||
Добавлено через 1 минуту и 10 секунд
Да, вариант, просто не хотелось бы делать громоздкое объявление DataRepositoryProducer в каждом методе, где он нужен... |