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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> правильно ли делать статический get 
:(
    Опции темы
oson
Дата 27.6.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот например есть класс
Код



public class State
{
    private static Integer val;
 
    public static Integer val()
    {
        return val;
    }

    public void setVal(Integer val)
    {
        State.val = val;
    }


}


и в Spring файлике я его инициализирую
Код

<bean id="state" class="util.State">
        <property name="val" value="0"/>
    </bean>


и где то я использую этот бин
Код

 Integer smth = State.val();



Метод static Integer val() получается имеет такое имя как статическая переменная в классе State. Можно было бы сделать static Integer getVal() - но меня смущает, что getVal() - это зарезервированное имя как бы для НЕстатических методов.
Как правильно -
1-делать метод статический с таким же именем как переменная val()
или
2 - делать метод статический getVal() ?
PM MAIL   Вверх
Kangaroo
Дата 28.6.2008, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

Репутация: 21
Всего: 104



Цитата(oson @  27.6.2008,  22:55 Найти цитируемый пост)
getVal() - это зарезервированное имя как бы для НЕстатических методов.

Никто его не резервировал, поэтому getVal() - лучший вариант.

Но смысла в классе с статическим гетом и нестатическим сетом я не вижу smile


--------------------
Lost....
PM MAIL MSN   Вверх
ecologist
Дата 28.6.2008, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 9



Тем более, что по умолчанию Спринг создает синглтоны - т.е. как раз один бин и будет создан. Вообщем-то не не вижу смысла в статике вообще. В данном конкретном случае.

Это сообщение отредактировал(а) ecologist - 28.6.2008, 00:19
PM MAIL   Вверх
oson
Дата 28.6.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если я делаю   Integer val не статик -то спринг ее вообще не инициализирует :(
Вот я пробую со статиком мудрить.
Да и когда мне надо получить эту самую Val где-то в коде - (это вроде глобальной переменной для всего приложения, которую я перед стартом приложения установил в нужное мне значение в конф файле спринга) - то не хочется каждый раз создавать новый обьект
Код

new State().getVal();
 

PM MAIL   Вверх
powerOn
Дата 28.6.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 47
Всего: 159



Цитата(oson @  28.6.2008,  16:01 Найти цитируемый пост)
Если я делаю   Integer val не статик -то спринг ее вообще не инициализирует :(

Значит ты что то не так делаешь. Все он должен инициализировать. 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
oson
Дата 29.6.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не совсем понятно следующее
Spring по умолчанию делает синглетон.
Но я когда хочу воспользоваться этим синглетоном - ну то есть тем самым единственным инстанцом который сгенерировал Спринг - то где я его должен взять?
Я же все равно делаю
Код

Integer smth = new State.getVal();

то есть создаю новый обьект коласса State.
Если же я напишу что-нибудь типа 
Код

  public class State
{
    private State instance;
    public static State instance()
    {
        if(instance == null) 
        {
           instance = new State();
        }
        return instance;
     }
}

то я во-первых буду дублировать ту работу наверное чтоделает Спринг когда создает единственный обьект класса
а во-вторых это будут 2 разных обьекта - тот что проинициализирует Спринг исходя из его xml файла, и тот что я создам вот тут в коде сам.
PM MAIL   Вверх
oson
Дата 29.6.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А иначе получается ошибка.
Спринг создает инстанц класса State  и устанавливает переменную val например в состояние 1.
Но когда я в другом месте кода хочу прочитать эту переменную val и делаю 
Код

Integer smth = new State().getVal();

то обьект этот же сосвсем другой в отличие от созданного Спрингом и переменная val там null.


PM MAIL   Вверх
gosnis
Дата 29.6.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 16.5.2007
Где: Тель Авив, Израил ь

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



Я не специалист в Спринге, но, по моему, Вы не совсем понимаете синглтон. Вся фишка синглтона в том, что его конструктор приватный. Вы не можете его запустить. Инстанс синглтона получается доступом к статической функции. Что то типа Singleton s = Singleton.getInstance().
Так что меня сильно смущает Ваше new State()

Это сообщение отредактировал(а) gosnis - 29.6.2008, 12:48
PM MAIL ICQ Skype MSN   Вверх
Greg
Дата 29.6.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.9.2006
Где: Беларусь, г.Минск

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



Цитата(oson @  29.6.2008,  10:52 Найти цитируемый пост)
Но я когда хочу воспользоваться этим синглетоном - ну то есть тем самым единственным инстанцом который сгенерировал Спринг - то где я его должен взять?

С помощью
Код

org.springframework.beans.factory.BeanFactory.getBean(String name) 

и его перегруженных аналогов. 
    Идея заключается в том, что бы передать управление процессом конструирования и инициализации объектов фреймворку. Соответственно приложение априори ничего не знает о том, как создать (проинициализировать) объект, хотя ему предоставляется возможность получить экземпляр(ы) требуемого объекта через фабричный метод getBean().
--------------------
Страх перед возможностью ошибки не должен отвращать нас от поисков истины.
PM MAIL   Вверх
oson
Дата 29.6.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это 

Код

State state =  (State)org.springframework.beans.factory.BeanFactory.getBean("statebean"); 

равносильно тому, чтоб прописать оба класса в конф файле спринга? Я имею ввиду вот так
Код



<beans>
    <bean id="function" class="my.Functions">
        <property name="state" ref="statebean"/>
    </bean>

     <bean id="statebean" class="my.State" singleton="true">
        <property name="val" value="1"/>
    </bean>
</beans>

public class Function
{
  private State state;
  public void setState()
  {
    this.state = state;
  }
}

PM MAIL   Вверх
Greg
Дата 30.6.2008, 00:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.9.2006
Где: Беларусь, г.Минск

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



Мухи и котлеты не путать. Прописать оба класса в конф файле спринга - значит указать ему как ты хочешь, что бы он создавал и инициализировал объекты этих классов. ВСЕ. После того, как приложение запустилось, в какой-то момент, спринг создает экземпляры объявленных в конфигурации классов и помещает их в свой контекст. 
Код

State state =  (State)org.springframework.beans.factory.BeanFactory.getBean("statebean"); 
 используется для получения ранее созданного экземпляра. По умолчанию, на одно объявление класса создается один его экземпляр. Все последующие вызовы этого же метода будут возвращать ссылку на тот же экземпляр.
--------------------
Страх перед возможностью ошибки не должен отвращать нас от поисков истины.
PM MAIL   Вверх
AntonSaburov
Дата 30.6.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата(oson @  29.6.2008,  11:09 Найти цитируемый пост)
Integer smth = new State().getVal();

В добавок в предыдущему посту - эта строка уже не подпадает под управление Spring - это ты сам создаешь такой объект. И сам должен его инициализировать. 
А то, что создал Spring надо брать из его же контекста и тольок оттуда. И вот именно в этом контексте будет существовать один экземпляр.
PM MAIL WWW ICQ   Вверх
oson
Дата 30.6.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так как правильно брать из его же контекста - прописав в файле спринга оба бина или используя BeanFactory.getBean("statebean")?
PM MAIL   Вверх
ivg
Дата 30.6.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



Цитата(oson @  30.6.2008,  18:18 Найти цитируемый пост)
Так как правильно брать из его же контекста - прописав в файле спринга оба бина или используя BeanFactory.getBean("statebean")?

С точки зрения Spring'а первый вариант, для этого он (Spring) и придуман.
Кроме того, по моему, второй вариант связан с определёнными сложностями - спринговый контекст, должен быть сконфигурирован определённым образом, чтобы в коде получить нужную реализацию интерфейса BeanFactory, и это не для каждого подойдёт. Возможно ошибаюсь, поправьте, кто спец по Спрингу.
PM MAIL   Вверх
Kangaroo
Дата 30.6.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


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

Репутация: 21
Всего: 104



Цитата(oson @  30.6.2008,  15:18 Найти цитируемый пост)
Так как правильно брать из его же контекста - прописав в файле спринга оба бина или используя BeanFactory.getBean("statebean")? 

Конечно первый вариант. Так ты уберешь зависимость от спринга (твои классы вообще не будут знать о его существовании) и бин фактори там не к чему.

Кстати, BeanFactory это интерфейс и статического метода getBean() у него никак не может быть.


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

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

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


 




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


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

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