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

Поиск:

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


татарский Нео
***


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

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



Цитата(chief39 @  4.12.2006,  14:50 Найти цитируемый пост)
Это лишь инструмент и как его использовать - решать разработчику. 
Естественно, опираясь на здравый смысл 

полностью согласен, пользуюсь не часто(как в последнее время и на яве попрограммисть не умного бывает времени), однако бывает иногда удобно приписать статик ничего сверхтакого не придумывая
Цитата(batigoal @  4.12.2006,  10:13 Найти цитируемый пост)
Да можно обойтись и без статика, теоретически. Например, создавая некий ключевой файл, или вешаясь на определенный порт. Более того, это решит проблему одного экземпляра на нескольких JVM. Но это все экзотика 

Вот как раз тот момент, конечно можно прибегнуть и к экзотике, но есть принцип KISS - "Keep it simple, stupid" smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
sergejzr
Дата 4.12.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



А кто сказал, что "ВСЕГДА"? В данном случае читабельность однозначно улучшится из за того, что строчек создания и инициализации обьекта, не влияющих на логику программы станет меньше.


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


Опытный
**


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

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



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


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

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

В итоге мы говорим об одном и том же, все дело в ровности рукsmile
Но где к примеру учат правильно освобождать класс, чтобы он был собран GC?

Рекомендую этот небольшой материал к прочтению дабы избежать в будущем
http://readlist.com/lists/tomcat.apache.or...rs/3/19056.html

http://wiki.apache.org/tomcat/OutOfMemory

и вообще почитать о проблеме
http://www.google.ru/search?hl=ru&q=pe...ngleton&lr=

А между прочим этой "кривостью" грешат и разработчики cglib и (по слухам) Spring.
Ни разу не сталкивались? 

Так что лучше имхо подальше держаться, тем более на начальной стадии программирования.

Это сообщение отредактировал(а) kkorsakoff - 4.12.2006, 18:02
PM MAIL WWW ICQ   Вверх
NotGonnaGetUs
Дата 4.12.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(LSD @  4.12.2006,  15:51 Найти цитируемый пост)
и то и другое поведение можно реализовать


Цитата(LSD @  4.12.2006,  15:51 Найти цитируемый пост)
 Кто мешает сделать его приватным

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

Цитата(LSD @  4.12.2006,  15:51 Найти цитируемый пост)
некий злоумышленник 

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

Цитата(LSD @  4.12.2006,  15:51 Найти цитируемый пост)
А зачем нужно сериализовать счетсчик объектов?

А почему бы и нет?
Н-р, чтобы возвращаемый при удалённых вызовах объект с пришитым счётчиком, вёл себя после десериализации точно так же как и до (допустим есть логика зависящая от количества созданных объектов).


Цитата(LSD @  4.12.2006,  15:51 Найти цитируемый пост)
Тем более что при сериализации конструктор все равно вызывается, можно сделать так, что достаточно будет существующих методов.

Даже у синглтона? А как же чудесный метод, название которого было выделено болдом?




Ещё раз:
Я не предлагаю никому разработать тз на счётчик объектов,  я просто говорю, что у решения с статиком воз и маленькая тележка ньюансов, игнорирование которых приводит к неочевидным ошибкам, а не игнорирование делает решение со статиком отнюдь не "хорошим", как было заявлено изначально.




Цитата(LSD @  4.12.2006,  15:51 Найти цитируемый пост)
Он некорректен для Java

Ещё раз:
Если бы класс Сlass можно было бы модифицировать - это было бы отличное решение.

То, что его нельзя модифицировать и из-за этого нужно плясать с бубном вокруг статик поля, значит что угодно, но только не то, что плясать с бубном хорошая практика программирования. Это костыль. Кривой и корявый.


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


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


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

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



kkorsakoff, интересные материалы.


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


Leprechaun Software Developer
****


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

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



Цитата(NotGonnaGetUs @  4.12.2006,  18:03 Найти цитируемый пост)
Если сделать его приватным, то можно будет реализовать только одно поведение, а не то и другое.

Почему же:
Код
  private static int count = 0;
  private static final boolean countDescendant = false;

  private static synchronized void inc(Starter o)
  {
    if(countDescendant)
    {
      count++;
    }
    else
    {
      if(o.getClass() == Starter.class)
        count++;
    }
  }


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

О чем я и говорю, если есть принципиальная возможность развалить систему, это еще не значит, что это плохой прием. Просто у него тоже есть свои недостатки.

Цитата(NotGonnaGetUs @  4.12.2006,  18:03 Найти цитируемый пост)
Н-р, чтобы возвращаемый при удалённых вызовах объект с пришитым счётчиком, вёл себя после десериализации точно так же как и до (допустим есть логика зависящая от количества созданных объектов).

Да, но на удаленной машине это количество уже другое. Да и вообще без четких требований тут можно спорить до опупения.

Цитата(NotGonnaGetUs @  4.12.2006,  18:03 Найти цитируемый пост)
Даже у синглтона? А как же чудесный метод, название которого было выделено болдом?

А причем тут синглтон? В данном контексте речь шла о счетчике объектов.

Цитата(NotGonnaGetUs @  4.12.2006,  18:03 Найти цитируемый пост)
Если бы класс Сlass можно было бы модифицировать - это было бы отличное решение.

То, что его нельзя модифицировать и из-за этого нужно плясать с бубном вокруг статик поля, значит что угодно, но только не то, что плясать с бубном хорошая практика программирования. Это костыль. Кривой и корявый.

1. Он не для этого создавался, это скорее служебны класс, чем класс общего назначения.
2. Ну поместишь ты статик поля в java.lang.Class и что это тебе даст?



Цитата(NotGonnaGetUs @  4.12.2006,  18:03 Найти цитируемый пост)
Я не предлагаю никому разработать тз на счётчик объектов,  я просто говорю, что у решения с статиком воз и маленькая тележка ньюансов, игнорирование которых приводит к неочевидным ошибкам, а не игнорирование делает решение со статиком отнюдь не "хорошим", как было заявлено изначально.

ОК, давай рассмотрим конкретный пример. Есть класс java.util.logging.LogRecord, и у каждого объекта есть уникальный sequenceNumber (например на тот случай если точности таймера недостаточно). Сейчас там все реализовано через static поля. Как ты предлагаешь это все реализовывать без них?


--------------------
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   Вверх
sergejzr
Дата 5.12.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Цитата(NotGonnaGetUs @  4.12.2006,  17:03 Найти цитируемый пост)
Ещё раз:
Я не предлагаю никому разработать тз на счётчик объектов,  я просто говорю, что у решения с статиком воз и маленькая тележка ньюансов, игнорирование которых приводит к неочевидным ошибкам, а не игнорирование делает решение со статиком отнюдь не "хорошим", как было заявлено изначально.

В принципе согласен. Статические переменные вещь не только неудобная, но и опасная (и не только в синглтоне). Их я кстати ввиду не имел, когда про читабельность говорил. 
Но удобство и целесообразность статических функций и констант, я надеюсь, Вы под сомнение ставить не будете?


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


Шустрый
*


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

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



Цитата(LSD @  5.12.2006,  13:13 Найти цитируемый пост)
Да и вообще без четких требований тут можно спорить до опупения.


Я и не спорил, а приводил факты иллюстрирующие недостатки решения со счётчиком на статиках. 



Цитата(LSD @  5.12.2006,  13:13 Найти цитируемый пост)
Ну поместишь ты статик поля в java.lang.Class и что это тебе даст?


Код

class Class {
    private int count;
}

где статик?


Цитата(LSD @  5.12.2006,  13:13 Найти цитируемый пост)
Почему же:

Это что такое?

Где находится этот метод?
Кто такой starter?
Откуда будет вызываться inc?
Как наследники класса Starter могут поменять значение countDescendant, настроив его под себя?

 

Цитата(sergejzr @  5.12.2006,  13:22 Найти цитируемый пост)
целесообразность статических функций

Как это ни банально звучит, но всё зависит от того, для чего они применяются.

Цитата(sergejzr @  5.12.2006,  13:22 Найти цитируемый пост)
и констант

Константы обозначаются парой "final static", что равно в некоторых случаях "const" (об этом я уже писал). Против "const" трудно что-то иметь smile Однако const - это не тоже самое, что static. 


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


Leprechaun Software Developer
****


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

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



Цитата(NotGonnaGetUs @ 6.12.2006,  14:25)
Я и не спорил, а приводил факты иллюстрирующие недостатки решения со счётчиком на статиках.

Предложи решение лучше.

Цитата(NotGonnaGetUs @ 6.12.2006,  14:25)
Цитата(LSD @  5.12.2006,  13:13 Найти цитируемый пост)
Ну поместишь ты статик поля в java.lang.Class и что это тебе даст?

Код

class Class {
    private int count;
}

где статик?

Об этом я и говорил, ну перенес ты поле count из класса в java.lang.Class, плюс сделал его из статика не статиком, и где тут кардинальное улучшение ситуации? Плюс ты предлагаешь ради одного класса со счетчиком добавить переменную count ко всем классам загруженным в JVM?


Цитата(NotGonnaGetUs @ 6.12.2006,  14:25)
Это что такое?

Где находится этот метод?
Кто такой starter?
Откуда будет вызываться inc?

Код
class Counter
{
  private static int count = 0;
  private static final boolean countDescendant;

  static
  {
    countDescendant = <check_some_condition>;
  }

  private static synchronized void inc(Counter o)
  {
    if(countDescendant)
    {
      count++;
    }
    else
    {
      if(o.getClass() == Counter.class)
        count++;
    }
  }

  private static synchronized void dec(Counter o)
  {
    if(countDescendant)
    {
      count--;
    }
    else
    {
      if(o.getClass() == Counter.class)
        count--;
    }
  }

  public static int getCount()
  {
    return count;
  }


  public Counter()
  {
    super();
    inc(this);
  }

  protected void finalize() throws Throwable
  {
    super.finalize();
    dec(this);
  }
}

Цитата(NotGonnaGetUs @ 6.12.2006,  14:25)
Как наследники класса Starter могут поменять значение countDescendant, настроив его под себя?

Как хочешь, хочешь даш возможность менять этот параметр, не хочешь не даш. Счетчий твой, и ты решаешь как и кто может его использовать.


--------------------
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
Дата 7.12.2006, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(LSD @  7.12.2006,  13:00 Найти цитируемый пост)
Предложи решение лучше.


Уже предложил smile

Если не видно другого решения - это не значит, что имеющееся хорошее. (народная мудрость)


Цитата(LSD @  7.12.2006,  13:00 Найти цитируемый пост)
Как хочешь, хочешь даш возможность менять этот параметр, не хочешь не даш. Счетчий твой, и ты решаешь как и кто может его использовать. 


Тогда на пальцах.

Counter <- Class A  <- Class B 

В counter хочу считать только экземпляры класса counter.
В A хочу считать экземпляры А + всех наследников.
В В - только количество экземпляров В.

Как мне менять этот параметр? smile
PM MAIL   Вверх
sergejzr
Дата 7.12.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Цитата(NotGonnaGetUs @  7.12.2006,  14:28 Найти цитируемый пост)
В counter хочу считать только экземпляры класса counter.
В A хочу считать экземпляры А + всех наследников.
В В - только количество экземпляров В.


Ясное дело, что тут несколько счётчиков надо smile

Цитата(NotGonnaGetUs @  6.12.2006,  13:25 Найти цитируемый пост)
Цитата(sergejzr @  5.12.2006,  13:22 Найти цитируемый пост)
целесообразность статических функций

Как это ни банально звучит, но всё зависит от того, для чего они применяются.


Не для чего применяются, а к чему относятся. Тот же sin к примеру. Если мемберы класса не используются (т.е функция самодостаточна), то можно делать static.




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


Leprechaun Software Developer
****


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

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



Цитата(NotGonnaGetUs @  7.12.2006,  15:28 Найти цитируемый пост)
Если не видно другого решения - это не значит, что имеющееся хорошее. (народная мудрость)

Сам придумал? smile

Поставленную задачу все равно надо выполнять, так что уж лучше выпольнить не идеальным способом, чем совсем отказаться от выполнения, мотивируя это тем, что идеального решения нет.

Цитата(NotGonnaGetUs @  7.12.2006,  15:28 Найти цитируемый пост)
Counter <- Class A  <- Class B 

В counter хочу считать только экземпляры класса counter.
В A хочу считать экземпляры А + всех наследников.
В В - только количество экземпляров В.

Как мне менять этот параметр?

Пусть у нас объектов типа Counter - 3, A - 7, B - 13. Значит счетчик в Counter = 3, в A = 20, B = 13. Разве не очевидно, что одним счетчиком тут не обойтись? Или ты сомневаешься в реализуемости таких счетчиков?


--------------------
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
Дата 8.12.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(sergejzr @  7.12.2006,  15:53 Найти цитируемый пост)
Не для чего применяются, а к чему относятся. Тот же sin к примеру. Если мемберы класса не используются (т.е функция самодостаточна), то можно делать static.


"Можно" != "Нужно" (ещё одна народная мудрость).

Н-р, сделав метод статическим мы уже не сможем его перекрыть в классе наследнике. 


Цитата(LSD @  7.12.2006,  18:11 Найти цитируемый пост)
Разве не очевидно, что одним счетчиком тут не обойтись? 

Ну так продемонстрируй.  Люблю очевидные вещи.

Очень хочется посмотреть на копи-паст кода из класса counter в A и В, или на новый класс "Counter", который теперь точно будет считать не сам себя, а другие классы.

И больше всего, хочется увидить "простоту" с какой static'и позволяют всё это сделать smile

Добавлено @ 14:21 
Цитата(LSD @  7.12.2006,  18:11 Найти цитируемый пост)
Поставленную задачу все равно надо выполнять, так что уж лучше выпольнить не идеальным способом, чем совсем отказаться от выполнения, мотивируя это тем, что идеального решения нет.


Следим за логикой:

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


Статики - это плохо. Классический пример плохого кода, который получается с их использованием: подсчёт количества экземпляров класса.

То, что другого решения для вас не существует, вовсе не значит, что плохой код сразу должен стать хорошим.

Вопрос:
Где я предлагаю отказаться от выполнения задачи?  Если такого места нет, то зачем пытаться мне это приписать?
PM MAIL   Вверх
sergejzr
Дата 8.12.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Цитата(NotGonnaGetUs @  8.12.2006,  13:13 Найти цитируемый пост)
"Можно" != "Нужно" (ещё одна народная мудрость).

Н-р, сделав метод статическим мы уже не сможем его перекрыть в классе наследнике. 

Естесственно нет. Естесственно любой инструмент надо применять по делу, а не просто так. Зачем например sin  в наследниках переписывать???


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


Leprechaun Software Developer
****


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

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



Цитата(NotGonnaGetUs @  8.12.2006,  14:13 Найти цитируемый пост)
Очень хочется посмотреть на копи-паст кода из класса counter в A и В, или на новый класс "Counter", который теперь точно будет считать не сам себя, а другие классы.

Ты имеешь в виду, научить тебя пользоваться Ctrl+C, Ctrl+V? smile


Цитата(NotGonnaGetUs @  8.12.2006,  14:13 Найти цитируемый пост)
Следим за логикой:
...
Вопрос:
Где я предлагаю отказаться от выполнения задачи?  Если такого места нет, то зачем пытаться мне это приписать?

А где я приписывал тебе, что ты предлагаешь отказаться от выполнения задачи? Там все безлично smile

NotGonnaGetUs, ты пока что не привел ни одного конкретного примера, а только критикуешь и сыпешь народными мудростями.
Раз уж ты ратуешь за возможность изменения java.lang.Class, то приведи конкретный пример, как это должно быть реализовано по твоему, а мы покритикуем smile


--------------------
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.1080 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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