Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Где лучше хранить константы в интерфейсе или


Автор: Royan 30.3.2008, 15:48
Народ, где вы храните константы и почему? 

Автор: Kangaroo 30.3.2008, 17:00
Цитата(Royan @  30.3.2008,  14:48 Найти цитируемый пост)
Народ, где вы храните константы и почему?  

Хранить константы в интерфейсе это вроде антипаттерн.

Автор: Royan 30.3.2008, 21:08
Вот тут нашлось:

JLS3 "13.4.9 final Fields and Constants"
Цитата

[...]We also recommend, as a general rule, that only truly constant values be declared in interfaces.[...]

Автор: w1nd 31.3.2008, 00:41
Константы следует хранить там, где они нужны smile Например, общие константы для Swing-компонент, находящиеся в интерфейсе SwingConstants - это явно порочная практика.

Автор: mbasil 31.3.2008, 09:17
То есть порочной практикой является наличие вообще каких-либо ОБЩИХ параметров,  настраивающих приложение? Правильно я понял ? 
И это потому, что нарушает ООП, поскольку глобальные (static) параметры это явное нарушение.
То есть надо помещать необходимые параметры (дублируя их) во все классы?
В какой момент? При инициализации приложения ?

Автор: w1nd 31.3.2008, 09:32
Цитата(mbasil @  31.3.2008,  09:17 Найти цитируемый пост)
То есть порочной практикой является наличие вообще каких-либо ОБЩИХ параметров,  настраивающих приложение? Правильно я понял ? И это потому, что нарушает ООП, поскольку глобальные (static) параметры это явное нарушение.То есть надо помещать необходимые параметры (дублируя их) во все классы?В какой момент? При инициализации приложения ?

Нет, вы неправильно поняли. Точнее вы ничего не поняли. При чём здесь ООП - вообще непонятно. Констант, глобальных для всего приложения практически не бывает - все имеют "хозяина", о дублировании чего вы ведёте речь - непонятно.

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






Автор: mbasil 31.3.2008, 12:07
Цитата

Констант, глобальных для всего приложения практически не бывает

А как же, например быть с константой PI, определенной в Math классе?
Подвергнуть разработчиков SUN остракизму?
Не знал, откровенно говоря, что разделитель строк я всегда должен "выковыривать" вызовом метода класса System, а константу использовать неправильно. 

Автор: math64 31.3.2008, 12:35
Quod licet Jovi non licet bovi - что дозволено Юпитеру(Sun-у) не дозволено быку.
При разработке библиотек для Java заранее неизвестно, где константы понадобятся - поэтому они и объявлены в специальных классах и интерфейсах.
Простому же пользователю обычно заранее известно, где его константы будут использоваться, поэтому ему луше следовать совету w1nd.

Автор: w1nd 31.3.2008, 12:58
Цитата(mbasil @  31.3.2008,  12:07 Найти цитируемый пост)
А как же, например быть с константой PI, определенной в Math классе?

На мой вгляд, эта константа как раз на своём месте.

Цитата(math64 @  31.3.2008,  12:35 Найти цитируемый пост)
При разработке библиотек для Java заранее неизвестно, где константы понадобятся - поэтому они и объявлены в специальных классах и интерфейсах.

Почему неизвестно? Если делается класс, методы которого воспринимают некоторые значения, то именно в этом классе и объявляются константы, соответствующие этим значениям.

Автор: Royan 1.4.2008, 14:02
В общем я нашел ответ на свой вопрос. Я вел речь о константах, которые могут использоваться в нескольких классах не связанных общей иерархией. Я просто приведу пример являющийся ответом на мой вопрос, если есть по нему вопросы, пожалуйста, задавайте, но перед этим, пожалуйста, ознакомьтесь с двумя документами:

http://java.sun.com/j2se/1.5.0/docs/guide/language/static-import.html
http://java.sun.com/docs/books/jls/third_edition/html/binaryComp.html#13.4.9

Теперь мой подход:
Код

package org.megaware.constants;
 
public final class Constants {
   public final static int GENERIC_INT = 0;
   // some other generic consts here
   public final static class Network {
       // some other Network consts here
       public final static int DEFAULT_PORT = 55888;
   }
   
   public final static class Gui {
       // some other GUI consts here
       public final static String APP_TITLE = "Megaware";
   }
}

Автор: w1nd 1.4.2008, 21:38
Цитата(Royan @  1.4.2008,  14:02 Найти цитируемый пост)
Теперь мой подход

Гм. Именно для продемонстрированных констант я не вижу никакого смысла в таком вынесении - они явно не общие smile 

Автор: Royan 2.4.2008, 00:15
Какой же вы занудливый человек w1nd, мимо вас, поди, ни одна соринка не пролетит - все сдуете. Это всего лишь пример измените имена на что душе угодно.

Автор: ki6opr 2.4.2008, 07:16
а можно вопрос а зачем для констант делать свой класс есть замечательная вещь Enum называется smile 

Автор: w1nd 2.4.2008, 08:16
Цитата(Royan @  2.4.2008,  00:15 Найти цитируемый пост)
Какой же вы занудливый человек w1nd, мимо вас, поди, ни одна соринка не пролетит - все сдуете.

Есть грешок smile 

Цитата(Royan @  2.4.2008,  00:15 Найти цитируемый пост)
Это всего лишь пример измените имена на что душе угодно. 

Всё равно smile Сейчас я ковыряюсь в Eclipse - плагин ваяю. Так вот в SWT как раз есть такой классец - с константами (их там сотни). Не устаю проклинать каждый день того, кто это придумал - жутко неудобно smile Вот и стараюсь предостеречь.

Автор: ecologist 2.4.2008, 09:35
А по-моему надо там, где логика подсказывает.

В конце концов public static final - и хоть в классе, хоть в интерфейсе. Все зависит от того к чему эта константа привязывается - а использовать советы по проектированию надо с головой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)