Элегантный способ создать глобальный константный класс - PullRequest
0 голосов
/ 04 февраля 2020

Я новичок в Java и мне интересно, как изящно создать глобальный объект, члены которого постоянны. Один из способов сделать это:

public class Global {
    public final static String NAME = "John Doe";
    public final static int AGE = 100;
}

и затем вызвать его снаружи как

import Global;
public static void main(String[] args) {
    int age = Global.AGE; // works fine; age cannot be modified
}

Единственная проблема: у меня в этом классе много переменных, которые я копирую из текстового файла и добавления ключевых слов "stati c", "publi c" и "final" громоздко и делает его уродливым. Я знаю, что это не большая проблема, но я бы хотел более элегантное решение для этого. Любые идеи? Я пробовал вложенные классы, но не смог понять, правильно ли он ведет себя.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

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

public final class Global {
    public static final String NAME = "John Doe";
    public static final int AGE = 100;
}

private Global() {
    //this prevents even the native class from 
    //calling this constructor as well :
    throw new AssertionError();
}

Преимущества :

  • Так как необходимые члены c импортируются статически, пространство имен класса не загрязняется.
  • Скомпилированный код имеет меньшее ограничение двоичной совместимости (этот «класс реализует интерфейс констант»).
  • Поскольку импорт stati c применяется только к текущему файлу (а не ко всей иерархии классов), легче определить, где объявлен каждый член stati c.
  • Семантика времени выполнения и времени компиляции более тесно выровнена при использовании импорта stati c вместо интерфейсов констант.
  • При необходимости могут быть объявлены блоки stati c.

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

1 голос
/ 04 февраля 2020

Вы можете использовать интерфейс также

public interface Global {
     String NAME = "John Doe";
     int AGE = 100;
}
...