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

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

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

Ответы на вопрос(10)

public static final String CONSTANT_STRING="CONSTANT_STRING";

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

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

например,

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

правильный ответ, который ты ищешь, это

import static com.package.YourConstantsClass.*;
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 ()

Создайте класс с именем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";
}

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

public static final String variableName = "string value";

в котором будут храниться все константы.

like ProjectNameConstants.java

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

например

classname :  MyAppConstants.java

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

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

MyAppConstants.MY_CONST

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;
    }
}

Enums можно использовать как константы.

Редактировать Можешь называть этоConstants.CONSTANT_STRING1

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() {
    }
}

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

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

public, static, final и печатать заглавными буквами.

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

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

Делать их безопасными во время компиляции. Если вы использовалиStrings, вы можете ошибиться"DATABASE_EXCEPTION" с"DATABSE_EXSCEPTION", и только обратите внимание во время исполнения (если вам повезло и вы заметили это вообще). Вы также можете получить прибыль от автозаполнения.

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

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

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

/** 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", а иногда означаетд и другие временаго, рассмотрите возможность использования 2 разных констант.

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's 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's [first] instantiation.
  }

}

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

Drawbacks:

Все члены вашей команды должны использовать один и тот же класс (ы) и одну и ту же номенклатуру для констант. В большом проекте было бы странно найти 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()) {

Как следует упорядочить константы в классе? В алфавитном порядке? Все связанные константы вместе? Для того, как они созданы / нужны? Кто должен нести ответственность за правильность порядка? Любое (достаточно большое) переупорядочение констант будет рассматриваться как беспорядок в системе управления версиями.

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

ВАШ ОТВЕТ НА ВОПРОС