Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Избавиться от singleton'ов может быть с помощью, Spring'а? 
:(
    Опции темы
Royan
Дата 24.3.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Пусть есть два startup класса, запускающие приложение в разных режимах, вот их структура:

Код

class A extends Parent {
    public void startUp() {
        Foo.getInstance().init();
        Moo.getInstance().init();
        // и еще 25 таких же
    }
} 

class B extends Parent {
    public void startUp() {
        Foo.getInstance().init();
        AnotherMoo.getInstance().init();
        // и еще 25 таких же
    }
} 


Оба класса отрастают от одного родителя. В обоих методах startUp() важен порядок инициализации сиглетонов, в то же время некоторые сиглетоны могут присутствовать в одном классе и отсутствовать в другом.

Задача: Упростить инициализацию и по возможности производить ее в одном месте. Это может быть метод в классе Parent, возможно эту задачу может решить Spring - вопрос как это сделать?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
jeank
Дата 24.3.2009, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 26.6.2008
Где: Калининград

Репутация: нет
Всего: 1



Ну насколько я помню - именно в самом синглетоне создают метод getInstance - а уж там в логике метода определяется существует ли экземпляр или нет, и если есть то вернуть, если нет то создать и вернуть.
Вот про порядок инициализации немного недопер, т.к. инициализация может идти в разных классах в зависимости от того кто первый, то и молодец )).
PM MAIL WWW   Вверх
ivg
Дата 24.3.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Сделать инициализацию в синглтонах ленивой. Ну и пусть они сами разбираются со своими зависимостями.
PM MAIL   Вверх
Royan
Дата 24.3.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



jeank, ivg, не понял как это может помочь решить мою проблему. Давайте я приведу еще один пример. Допустим у вас следующие набор вызовов в методах класса A и B:

Код

// A.java
// ...
Foo1.getInstance().init();
Foo2.getInstance().init();
Foo3.getInstance().init();
Foo4.getInstance().init();
XXX.getInstance().init(); /* Очень важно, чтобы этот вызов произошел после Foo4.getInstance().init(); и перед Foo5.getInstance().init(); */
Foo5.getInstance().init();
Foo6.getInstance().init();
// ...

// B.java
// ...
Foo1.getInstance().init();
Foo2.getInstance().init();
Foo3.getInstance().init();
Foo4.getInstance().init();
YYY.getInstance().init(); /* Очень важно, чтобы этот вызов произошел после Foo4.getInstance().init(); и перед Foo5.getInstance().init(); */
Foo5.getInstance().init();
Foo6.getInstance().init();
// ...





--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
ivg
Дата 24.3.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Вообще я имел ввиду что-то типа такого:
Код

public final class Singleton {
    
    private static Singleton instance;

    private Singleton() {}
    
    private void init() {
        OtherSingleton other = OtherSingleton.getInstance();
        // self initialization
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
            instance.init();
        }
        return instance;
    }
    
}

Ну то есть идея понятна? Singleton зависит от инициализации OtherSingleton и эта зависимость прописывается явно.
В другом варианте можно, например, вынести метод init(); в интерфейс, и вызывать в цикле. Порядок вызова будет определяться составом массива.
Вообще надо смотреть архитектуру целиком, чтобы что-то конкретное предлагать, ну а так - вот. smile 

Это сообщение отредактировал(а) ivg - 24.3.2009, 21:27
PM MAIL   Вверх
Royan
Дата 25.3.2009, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



ivg, Ты все правильно понял. Вот такие зависимости сплошь и рядом, более того OtherSingleton чаще всего (а вернее всегда) отсутствует серди вызовов в методе startUp(), но опять же моя задача состоит в том чтобы все зависимости были прописаны в одном месте.

Предлагаю представить, что в описанном ivg, примере Singleton.getInstance(); вызывается в двух startUp() классах. И вот вам пришла идея зарефакторить один из startUp метдов, что вы успешно и сделали, но как только вы пускаете приложение в режиме где инициализация проходит из второго класса оказывается что вам надо проделать все то же самое что вы уже проделали только для первого класса.

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


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.4228 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.