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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> static - хорошо или плохо? 
:(
    Опции темы
TupleCa
Дата 3.12.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



объявление переменных и методов как static является ли как плохим стилем программировани?

вообще  я читал что лучше что бы не было таких.

хотел бы узнать тогда примеры, когда без static вообще никак, кроме слуая c main()
PM   Вверх
powerOn
Дата 3.12.2006, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



static - это хорошо. Классический пример: Подсчет количества экземпляров классов. при создании экземпляра счетчик увеличивается на 1, при уничтожении - уменьшается на единицу.
Еще пример: с помощью static хорошо хранить константы:

Код

class Colors {
    public final static int RED = 1;
    public final static int GREEN = 2;
.......

}


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

Про методы:
Иногда есть необходимость отделить алгоритм от данных. Вернее алгоритм не нуждается в запоминании данных. Такие методы неплохо объединить в классы-утилиты. Хороший пример, всем известный класс java.lang.Math со своими статическими методами cos(), sin() и т.д.


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

PM MAIL   Вверх
batigoal
Дата 3.12.2006, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

Репутация: 24
Всего: 151



Цитата(TupleCa @  3.12.2006,  21:37 Найти цитируемый пост)
объявление переменных и методов как static является ли как плохим стилем программировани?

Как таковые, static-члены не являются ни плохими, ни хорошими. Другое дело, что в не всегда их применение является оправданным.

Думай об этом так: если значение поля будет различным для каждого из объектов данного класса, то они не должны являться статичными. Если же это свойство распространяет свое действие на все объекты класса, и его значение является одинаковым для всех них - это static-поле.
Аналогично, если метод нуждается для своей работы в данных из конкретного экземпляра - это обычный метод. Если же он имеет смысл и без создания экземпляра класса - это static-метод. Например, Calendar.getAvailableLocales(). Для получения списка возможных локализаций календаря нам нет необходимости создавать реальный объект - ведь для всех экземпляров календаря этот список будет одинаковым.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
nerezus
Дата 4.12.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Цитата

вообще  я читал что лучше что бы не было таких.
 Больше эту штуку не читай )

Добавлено @ 10:11 
Пример: паттерн singleton. Ну и как его без static сделать? )


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
batigoal
Дата 4.12.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

Репутация: 24
Всего: 151



Цитата(nerezus @  4.12.2006,  11:09 Найти цитируемый пост)
Пример: паттерн singleton. Ну и как его без static сделать? )

Да можно обойтись и без статика, теоретически. Например, создавая некий ключевой файл, или вешаясь на определенный порт. Более того, это решит проблему одного экземпляра на нескольких JVM. Но это все экзотика smile


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
TupleCa
Дата 4.12.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я всё-таки думаю, что статик-члены это "зло". хотя с его использованием можно решить некоторые задачи более эффективно, но всё-таки если не критично, то нужно без него обходиться стараться. а в дальнейшем вообще убрать его из языка.
PM   Вверх
LSD
Дата 4.12.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(nerezus @  4.12.2006,  10:09 Найти цитируемый пост)
Пример: паттерн singleton. Ну и как его без static сделать? )

Почитай Маленький тест, там это уже обсуждалось smile


Цитата(TupleCa @  4.12.2006,  11:25 Найти цитируемый пост)
я всё-таки думаю, что статик-члены это "зло". хотя с его использованием можно решить некоторые задачи более эффективно, но всё-таки если не критично, то нужно без него обходиться стараться. а в дальнейшем вообще убрать его из языка.

Это не зло, это просто средство. Другое дело что им можно пользоваться неправильно. Хороший пример привел powerOn, создавать экземпляр java.lang.Math для того чтобы посчитать синус это как минимум глупо.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
NotGonnaGetUs
Дата 4.12.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 4
Всего: 12



Цитата(powerOn @  3.12.2006,  20:51 Найти цитируемый пост)
static - это хорошо. Классический пример: Подсчет количества экземпляров классов. при создании экземпляра счетчик увеличивается на 1, при уничтожении - уменьшается на единицу.


Пока не появились классы наследники - да. Пока не пошли игры с сериализацией - да.
Поэтому никакого "хорошо" тут нет.

Естественное место для такого "счётчика" - это обычное поле в классе Class данного объекта.


Цитата(powerOn @  3.12.2006,  20:51 Найти цитируемый пост)
Еще пример: с помощью static хорошо хранить константы:


"final static" - это синонимом "const", но только до тех пор, пока хранимый объект является immutable.

Пока "final static" является "const" - всё хорошо.
В противном случае получаем выставленный на всеобщее обозрение и изменение объект, что очень и очень плохо. Это требует доказательств?

Отличное место для хранения констант enum. 


Цитата(powerOn @  3.12.2006,  20:51 Найти цитируемый пост)
Иногда есть необходимость отделить алгоритм от данных. Вернее алгоритм не нуждается в запоминании данных. Такие методы неплохо объединить в классы-утилиты. Хороший пример, всем известный класс java.lang.Math со своими статическими методами cos(), sin() и т.д. 


1. Отделение алгоритма от данных != stateless алгоритмам.

а) Паттерн визитор на статик методах пробовали делать? Полиморфизм на статик методах не работает.

б) stateless чаще всего достигается за счёт передачи большого числа параметров в метод. Декомпозиция подобных методов приводит к появлению "кочующих" параметров и прочим антипаттернам структурного программирования.
Избавившись от stateless (связав данные и их обработку) легко избавиться от кочующих параметров.

2. Методы можно очень плохо объединить в классы, особенно stateless методы и особенно в классы-утилиты, содержащие кучу не связных друг с другом методов, порою дублирующих друг друга.  

3. java.lang.Math хороший пример того, как не нужно делать.  Классы с полностью статическими методами не поддаются настройке, и их использование приводит к тому, что более общие классы оказываются в зависимости от деталей реализации (читать про osp, н-р, в книге http://www.ozon.ru/context/detail/id/1573723/  и про ioc).


Цитата(batigoal @  3.12.2006,  22:48 Найти цитируемый пост)
Другое дело, что в не всегда их применение является оправданным.

вот она истина smile

Цитата(nerezus @  4.12.2006,  10:09 Найти цитируемый пост)
Пример: паттерн singleton. Ну и как его без static сделать? ) 

Синглтон тоже не бог весть какой полезный паттерн. Он уместен в случаях, когда нужно вынести конфигурацию некоторых связей в приложении из compile в runtime time. Остальные случаи использования синглтонов либо неуместны, либо могут быть заменены апектами, фокусами с атрибутами и прочей кодогенерацией без образования не контролируемых связей в приложении.

Совсем без static-ов не обойтись (в java), но прежде чем их использовать нужно кучу раз подумать над тем, как обойтись без них.

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


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(NotGonnaGetUs @  4.12.2006,  13:53 Найти цитируемый пост)
Пока не появились классы наследники - да. Пока не пошли игры с сериализацией - да.

1. Чем мешают наследники?
2. private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; пока никто не отменял.

Цитата(NotGonnaGetUs @  4.12.2006,  13:53 Найти цитируемый пост)
Естественное место для такого "счётчика" - это обычное поле в классе Class данного объекта.

Пример как это сделать.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
chief39
Дата 4.12.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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



Прямо таки спор что лучше - стул или отбойный молоток....

Если молотком неудобно кушать - это не значит что его надо выбросить.

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


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
NotGonnaGetUs
Дата 4.12.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 4
Всего: 12



Цитата(LSD @  4.12.2006,  14:10 Найти цитируемый пост)
Чем мешают наследники


Наследник обязан увеличивать счётчик при своём создании или нет?
А кто гарантирует, что какой-то наследник не решит воспользоваться этим полем по своему усмотрению, а в итоге перестанет работать класс родитель?
И т.д.



Цитата(LSD @  4.12.2006,  14:10 Найти цитируемый пост)
пока никто не отменял.

По дефолту статик поля не сериализуются. 
Нужно делать это вручную.
Нужно проверять в той ли jvm был восстановлен объект, чтобы корректно изменять счётчик.
Является акт десериализации созданием объекта? 
И т.д.

Цитата(LSD @  4.12.2006,  14:10 Найти цитируемый пост)
Пример как это сделать.

Я привёл пример, как сделать счётчик "правильно".
То, что Class класс идущий в составе jdk нельзя модифицировать (без игр с рантаймом) не значит, что мой пример не корректен.

PM MAIL   Вверх
kkorsakoff
Дата 4.12.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 14



Добавлю свои 5 копеек.
Игры с синглтонами могут очень быстро привести к OutOfMemory PermGen space'а. Это я говорю про рестарт веб-приложений. Так что в j2ee лучше даже и не думать пользоваться паттерном синглтон.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 4.12.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Цитата(kkorsakoff @  4.12.2006,  14:21 Найти цитируемый пост)
Добавлю свои 5 копеек.
Игры с синглтонами могут очень быстро привести к OutOfMemory PermGen space'а. Это я говорю про рестарт веб-приложений. Так что в j2ee лучше даже и не думать пользоваться паттерном синглтон. 


Если криво программить, то и сингелтона для этого необязательно smile 

Как уже сказали, static - инструмент. Если его использовать по назначению - всё будет хорошо и он позволит избежать нескольких занятых ячеек памяти и ненужных строк кода, что может повысить его читабельность.  


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
TupleCa
Дата 4.12.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(sergejzr @  4.12.2006,  15:32 Найти цитируемый пост)
что может повысить его читабельность. 


думаю, что  не всегда при уменьшении кода улучшается его читабельность. 
PM   Вверх
LSD
Дата 4.12.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(NotGonnaGetUs @  4.12.2006,  15:11 Найти цитируемый пост)
Наследник обязан увеличивать счётчик при своём создании или нет?

Все зависит от конкретных условий, но и то и другое поведение можно реализовать.

Цитата(NotGonnaGetUs @  4.12.2006,  15:11 Найти цитируемый пост)
А кто гарантирует, что какой-то наследник не решит воспользоваться этим полем по своему усмотрению, а в итоге перестанет работать класс родитель?

1. Кто мешает сделать его приватным?
2. Где гарантия, что некий злоумышленник не воспользуется рефлексией и не развалит вообще все?

Цитата(NotGonnaGetUs @  4.12.2006,  15:11 Найти цитируемый пост)
По дефолту статик поля не сериализуются. 
Нужно делать это вручную.

А зачем нужно сериализовать счетсчик объектов?

Цитата(NotGonnaGetUs @  4.12.2006,  15:11 Найти цитируемый пост)
Нужно проверять в той ли jvm был восстановлен объект, чтобы корректно изменять счётчик.
Является акт десериализации созданием объекта? 

Зачем это все нужно? Объект был создан? Был. Увеличиваем счетчик. Тем более что при сериализации конструктор все равно вызывается, можно сделать так, что достаточно будет существующих методов.
Там еще есть clone(), но там проблемы тоже решаются.


Цитата(NotGonnaGetUs @  4.12.2006,  15:11 Найти цитируемый пост)
Я привёл пример, как сделать счётчик "правильно".
То, что Class класс идущий в составе jdk нельзя модифицировать (без игр с рантаймом) не значит, что мой пример не корректен.

Он некорректен для Java.
Кстати, а в каком ЯП он корректен?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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