Вопрос-ответ

What is the best way to implement constants in Java? [closed]

Какой лучший способ реализовать константы в Java?



Я видел подобные примеры:

public class MaxSeconds {
public static final int MAX_SECONDS = 25;
}

и предположил, что у меня мог бы быть класс Constants, в который можно было бы обернуть константы, объявив их статическими final . Я практически не знаю Java вообще, и мне интересно, лучший ли это способ создания констант.

Переведено автоматически
Ответ 1

Это вполне приемлемо, возможно, даже стандартно.

(public/private) static final TYPE NAME = VALUE;

где TYPE - тип, NAME - имя, набранное заглавными буквами с подчеркиванием пробелов, и VALUE - постоянное значение;

Я настоятельно рекомендую НЕ помещать ваши константы в их собственные классы или интерфейсы.

В качестве дополнительного примечания: переменные, которые объявлены final и являются изменяемыми, все равно могут быть изменены; однако переменная никогда не может указывать на другой объект.

Например:

public static final Point ORIGIN = new Point(0,0);

public static void main(String[] args){

ORIGIN.x = 3;

}

Это законно и ORIGIN тогда была бы точка в (3, 0).

Ответ 2

Я бы настоятельно не советовал использовать один класс constants. В то время это может показаться хорошей идеей, но когда разработчики отказываются документировать константы и класс разрастается до более чем 500 констант, которые вообще не связаны друг с другом (будучи связанными с совершенно разными аспектами приложения), это обычно приводит к тому, что файл констант становится полностью нечитаемым. Вместо этого:


  • Если у вас есть доступ к Java 5+, используйте перечисления, чтобы определить ваши конкретные константы для области приложения. Все части области приложения должны ссылаться на перечисления, а не на постоянные значения для этих констант. Вы можете объявить перечисление аналогично тому, как вы объявляете класс. Перечисления, пожалуй, самая (и, возможно, единственная) полезная функция Java 5+.

  • Если у вас есть константы, которые допустимы только для определенного класса или одного из его подклассов, объявите их либо как защищенные, либо как общедоступные и поместите их в верхний класс в иерархии. Таким образом, подклассы могут получить доступ к этим постоянным значениям (и если другие классы получают к ним доступ через public, константы действительны не только для определенного класса ... что означает, что внешние классы, использующие эту константу, могут быть слишком тесно связаны с классом, содержащим константу)

  • Если у вас есть интерфейс с определенным поведением, но возвращаемые значения или аргументы должны быть конкретными, вполне допустимо определить константы в этом интерфейсе, чтобы другие разработчики имели к ним доступ. Однако избегайте создания интерфейса только для хранения констант: он может стать таким же плохим, как класс, созданный только для хранения констант.

Ответ 3

Это ПЛОХАЯ ПРАКТИКА использовать интерфейсы только для хранения констант (названный Джошем Блохом constant interface pattern). Вот что советует Джош.:


Если константы сильно привязаны к существующему классу или интерфейсу, вам следует добавить их в класс или интерфейс. Например, все упакованные классы числовых примитивов, такие как Integer и Double, экспортируют константы MIN_VALUE и MAX_VALUE. Если константы лучше всего рассматривать как члены перечисляемого типа, вам следует экспортировать их с типом enum. В противном случае вам следует экспортировать константы с помощью неинсталлируемого служебного класса.


Пример:

// Constant utility class
package com.effectivejava.science;
public class PhysicalConstants {
private PhysicalConstants() { } // Prevents instantiation

public static final double AVOGADROS_NUMBER = 6.02214199e23;
public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
public static final double ELECTRON_MASS = 9.10938188e-31;
}

О соглашении об именовании:


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


Ответ 4

В Effective Java (2-я редакция) рекомендуется использовать перечисления вместо статических целых чисел для констант.

Здесь есть хорошая статья о перечислениях в Java: http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html

Обратите внимание, что в конце этой статьи ставится вопрос:


Итак, когда следует использовать перечисления?


С ответом:


Каждый раз, когда вам нужен фиксированный набор констант


java