понедельник, 29 июня 2009 г.

Константы в JAVA

В который раз уже задался странным вопросом: "Как лучше хранить и передавать значение констант в JAVA?"

В итоге покопавшись в интернете нашел 3 способа:

1. Передача через статические переменные в классе:

public class ConstantClass {
public static final String CONSTANT = "TEST";
...
}

2. Передача через интерфейсы:
public interface ConstantImpl {
public static String CONSTANT = "TEST";
...
}

3. Передача через Enums:
public enum ConstantEnum {
CONSTANT ("TEST");
private final String constant;

ConstantEnum(String constant) {
this.constant = constant;
}

public String constant() {
return constant;
}
}

4. Специфицирование объекта как "const". Может быть использовано только по отношению к объектам, применение его к примитивам (int, byte, long и т.д.) приведет к ошибке компиляции. Но это лишь миф!!! До сих пор данная фича не используется и существует только лишь в теории: A Comprehensive Theory of Adding 'const' to Java

Давайте рассмотрим, как будет выглядеть получение значения константы для каждого из перечисленных методов:
1. String constantClass = ConstantClass.CONSTANT;

2. Сперва надо имплементировать интерфейс:
class ConstantTest implements ConstantImpl, и тогда можно будет явно вызвать константу следующим образом:
String constantInterface = CONSTANT;

3. String constantEnum = ConstantEnum.CONSTANT.constant();

А теперь давайте разберемся чем же хороши или плохи данные реализации передачи констант:
1. Передача через статические переменные в классе
Никаких серьезных минусов мной не обнаружено... ищу...

2. Передача через интерфейсы
Основной минус, обнаруженный на страницах интернета - данная реализация это АНТИПАТТЕРН. Но чем он плох? Об этом никто не высказался. Из своих наблюдений могу сказать лишь одно неудобство: если вы используете несколько интерфейсов с константами, имеющими одинаковые имена, и потом имплементируете их в один класс, то Вам придется в любом случае конкретизировать какую из них вы желаете использовать. Лично мне это показалось неудобным, а кому-то это будет нормально. Каждому своё!

3. Передача через Enums
На сколько я понял именно этот механизм был разработан специально для определения и передачи констант. Т.е. подобная реализация сделана по науке.

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

Спасибо за внимание.



2 комментария:

Unknown комментирует...

В Java 6 появился механизм статического импорта, позволяющий "втянуть" константы в текущее пространство имён из другого класса и использовать их без модификатора. Так что теперь действительно нет необходимости для этого заставлять класс реализовывать какие-то сомнительные интерфейсы, содержащие одни константы.

А.Б. комментирует...

Алексей, Спасибо!

Как-то упустил их из виду :)

Вот кстати и примеры с ними:

http://java.sun.com/j2se/1.5.0/docs/guide/language/static-import.html

тут также упоминается и Constant Interface Antipattern :)

Условия копирования публикаций:

Все публикации в данном блоге являются частной собственностью авторов. Любое копирование информации допускается только при условии указания имени автора и активной ссылки на источник.