В который раз уже задался странным вопросом: "Как лучше хранить и передавать значение констант в 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 комментария:
В Java 6 появился механизм статического импорта, позволяющий "втянуть" константы в текущее пространство имён из другого класса и использовать их без модификатора. Так что теперь действительно нет необходимости для этого заставлять класс реализовывать какие-то сомнительные интерфейсы, содержащие одни константы.
Алексей, Спасибо!
Как-то упустил их из виду :)
Вот кстати и примеры с ними:
http://java.sun.com/j2se/1.5.0/docs/guide/language/static-import.html
тут также упоминается и Constant Interface Antipattern :)
Отправить комментарий