Совместное использование постоянных строк в Java во многих классах?

Я хотел бы иметь константные строки Java в одном месте и использовать их во всем проекте (многие классы).

Каков рекомендуемый способ достижения этого?

Ответ 1

public static final String CONSTANT_STRING="CONSTANT_STRING";

константы должны быть:

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

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

например,

JFrame имеет EXIT_ON_CLOSE contant, любой класс, который подклассы JFrame будет иметь к нему доступ, и имеет смысл хранить в JFrame, а не в JComponent, поскольку не все компоненты будут иметь возможность быть закрытым.

Ответ 2

Вы должны создать класс констант, который хранит все константы.

как ProjectNameConstants.java

который содержит всю константу string static, поскольку вы можете получить к ней доступ через имя класса.

например.

classname :  MyAppConstants.java

public static final String MY_CONST="my const string val";

вы можете получить к нему доступ как

MyAppConstants.MY_CONST

Ответ 3

Как уже сообщал @mprabhat, константы должны быть public, static, final и напечатаны заглавными буквами.

Группирование их в классе помогает вам:

  • Не нужно знать все константы, которые у вас есть. Многие IDE (например, Eclipse) показывают вам список всех полей, которые имеет класс. Поэтому вы только нажимаете CTRL+SPACE и получаете подсказку о том, какие константы вы можете использовать.

  • Создание типов во время компиляции. Если вы использовали String s, вы можете пропустить "DATABASE_EXCEPTION" с помощью "DATABSE_EXSCEPTION" и только во время выполнения заметить (если вам повезет и вообще его заметили). Вы также можете получить прибыль от автозавершения.

  • Помогает вам сохранять память во время выполнения. Вам понадобится только память для 1 экземпляра константы. I.E: (реальный пример) Если у вас есть String "DATABASE_EXCEPTION" 1000 раз в разных классах в вашем коде, каждый из них будет отличаться от памяти.

Некоторые другие соображения, которые могут возникнуть:

  • Добавьте комментарии javadoc, поэтому программисты, которые используют константы, могут иметь больше семантической информации о константе. Он отображается как подсказка при нажатии CTRL+SPACE. I.E:

    /** Indicates an exception during data retrieving, not during connection. */
    public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
    /** Indicates an exception during the connection to a database. */
    public static final String DATABASE_CONNECTION_EXCEPTION =" DATABASE_CONNECTION_EXCEPTION";
    
  • Добавить семантику в идентификатор константы. Если у вас есть константа "Y", а иногда означает да и другие времена года, рассмотрите возможность использования двух разных констант.

    public static final String Y = "Y"; // Bad
    public static final String YEAR = "Y";
    public static final String YES = "Y"; 
    

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

    /** Year symbol, used for date formatters. */
    public static final String YEAR = "A"; // Year is Año, in Spanish.
    public static final String YES = "S"; // Yes is Sí, in Spanish.
    
  • Возможно, вы не знаете значения своих констант до времени выполнения. IE: вы можете прочитать их из файлов конфигурации.

    public class Constants
    {
      /** Message to be shown to the user if there any SQL query problem. */
      public static final String DATABASE_EXCEPTION_MESSAGE; // Made with the 2 following ones.
      public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
      public static final String MESSAGE = "MESSAGE";
    
      static {
        DATABASE_EXCEPTION_MESSAGE = DATABASE_EXCEPTION + MESSAGE; // It will be executed only once, during the class [first] instantiation.
      }
    

    }

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

Недостатки:

  • Все члены вашей команды должны использовать один и тот же класс и одну и ту же номенклатуру для констант. В большом проекте было бы не странно находить 2 определения:

    public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
    public static final String EXCEPTION_DATABASE = "DATABASE_EXCEPTION"; 
    

    выделили несколько сотен строк или в разных постоянных классах. Или еще хуже:

    /** Indicates an exception during data retrieving, not during connection. */
    public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
    /** Indicates an exception during data retrieving, not during connection. */
    public static final String EXCEPTION_DATABASE = "EXCEPTION_DATABASE"; 
    

    разные идентификаторы для разных значений, имеющие одинаковое значение (и используемые для тех же целей).

  • Это может ухудшить читаемость. Чтобы написать больше для того, чтобы сделать то же самое:

    if ("Y".equals(getOptionSelected()) {
    

    против

    if (ConstantsWebForm.YES.equals(getOptionSeleted()) {
    
  • Как следует упорядочивать константы в классе? В алфавитном порядке? Все связанные константы вместе? Для того, чтобы они были созданы/необходимы? Кто несет ответственность за правильность заказа? Любое (достаточно большое) переупорядочение констант будет рассматриваться как беспорядок в системе управления версиями.

Ну, это заняло больше времени, чем я ожидал. Любая помощь/критика приветствуется.

Ответ 4

Лучшей практикой является использование Java Enum (после Java 5)

Проблемы с классом:

  • Не типы
  • Нет пространства имен
  • Хрупкость

Пожалуйста, проверьте java-документы.

public enum Constants {

    CONSTANT_STRING1("CONSTANT_VALUE1"), 
    CONSTANT_STRING2("CONSTANT_VALUE2"), 
    CONSTANT_STRING3("CONSTANT_VALUE3");

    private String constants;

    private Constants(String cons) {
        this.constants = cons;
    }
}

Перечисления могут использоваться как константы.

Изменить: Вы можете назвать это Constants.CONSTANT_STRING1

Ответ 5

public class SomeClass {
    public static final String MY_CONST = "Some Value";
}

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

public class Constants {
    public static final String CONST_1 = "Value 1";
    public static final int CONST_2 = 754;

    private Constants() {
    }
}

Тогда не будет возможности создать экземпляр этого класса.

Ответ 6

Создайте класс под названием Constants в базе вашего основного пакета (т.е. com.yourcompany) со всеми вашими константами. Также сделайте конструктор закрытым, так что из этого класса не будет создан объект:

public class Constants {

    private Constants() {
        // No need to create Constants objects
    }

    public static final String CONSTANT_ONE = "VALUE_CONSTANT_ONE";
    public static final String CONSTANT_TWO = "VALUE_CONSTANT_TWO";
}

Ответ 7

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

Ответ 8

Создайте общедоступный class и для каждой строки константы создайте поле, подобное этому

public static final String variableName = "string value";

Ответ 9

public enum Constants {

CONSTANT_STRING1("CONSTANT_VALUE1"), 
CONSTANT_STRING2("CONSTANT_VALUE2"), 
CONSTANT_STRING3("CONSTANT_VALUE3");

private String constants;

private Constants(String cons) {
    this.constants = cons;
}
    @JsonValue
@Override
public String toString() {
    return constants;
}

}

Используйте его Constants.CONSTANT_STRING1.toString()