powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Одиночка и статическая инициализация
4 сообщений из 4, страница 1 из 1
Одиночка и статическая инициализация
    #34380817
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть класс одиночка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public   class  Security {
     private   static   final  String PUBLIC_FILE = "keys/public.pem";// TODO вынести в настройку
     private   static  Security security =  new  Security();

     protected  Security() {
        String publicFile = Thread.currentThread().getContextClassLoader().getResource(PUBLIC_FILE).getFile();
    ...
    }
}
Потом захотелось вынести PUBLIC_FILE значение в настройку, т.е.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 public   class  Security {
     private   static   final  String PUBLIC_FILE;
     private   static  Security security =  new  Security();

     static  {
        String defaultValue = "keys/public.pem";
         try  {
            defaultValue = (String)( new  InitialContext()).lookup("java:/comp/env/publicFile");
        }  catch  (NamingException ex) {
            Logger.getLogger(currPackage).error(ex);
        }
        PUBLIC_FILE = defaultValue;
    }
    ....
Но блок статической инициализации срабатывает позже чем вызов конструктора. В конструкторе значение тоже присвоить не удаcться. Единственный способ, который нашел это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
     private   static   final  String PUBLIC_FILE =  new  Object() {
         public  String getValue() {
            String defaultValue = "keys/public.pem";
             try  {
                defaultValue = (String)( new  InitialContext()).lookup("java:/comp/env/publicFile");
            }  catch  (NamingException ex) {
                Logger.getLogger(currPackage).error(ex);
            }
             return  defaultValue;
        }
    }.getValue();

Есть подозрение что похожая проблема возникает не только у меня. Это единственный способ? Кто как делает в таких ситуациях?
Или, если данная переменная не учавствует в статических методах, то сделать ее просто final и определять в конструкторе?
Вообщем как делать правильно?
...
Рейтинг: 0 / 0
Одиночка и статическая инициализация
    #34380832
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Статика инициализируется по порядку.
Переставь местами конструктор с блоком инициализации.
...
Рейтинг: 0 / 0
Одиночка и статическая инициализация
    #34380865
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вах шайтан, заработало
Спасибо!
...
Рейтинг: 0 / 0
Одиночка и статическая инициализация
    #34380930
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я б еще переименовал PUBLIC_FILE в publicFile... это все ж таки уже не жестко определенная константа, а переменная.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Одиночка и статическая инициализация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]