Константы Java в пакетах

У меня есть проект, состоящий из 5 разных пакетов на Java. Все они содержат классы с магическими числами и жестко заданными строками, для которых я хочу создать константы. Я хотел бы знать, что является лучшей практикой. Должен ли я создать один класс констант для всех констант в программе, которые все классы могут импортировать? Или было бы более эффективно разделить константы на несколько файлов меньшего размера?


person Kyle Peters    schedule 19.07.2017    source источник
comment
Эффективнее в отношении чего? Скорость бега?   -  person Kayaman    schedule 19.07.2017
comment
imho, вы не должны смешивать константы, которые связаны с разными проблемами в одном классе.   -  person Arnaud Denoyelle    schedule 19.07.2017
comment
Изменяются ли какие-либо из этих констант или магических значений в зависимости от того, в какой среде находится код? Например, строка подключения dev и строка подключения prod?   -  person oooyaya    schedule 19.07.2017
comment
Файлы ResourceBundle(s) и Properties – замечательные вещи.   -  person Elliott Frisch    schedule 19.07.2017
comment
Класс констант — это антипаттерн. Константы принадлежат тому классу, к которому они принадлежат. Integer.MAX_VALUE хорошо; IntegerConstants.MAX_VALUE было бы бессмысленным разделением. И уж точно не стоит делать один класс, содержащий константы из всех пакетов.   -  person VGR    schedule 19.07.2017
comment
Рассмотрите возможность использования enums.   -  person Andrew S    schedule 19.07.2017
comment
Хотя именованные константы хороши, определенно лучше, чем встроенные литералы в 19 из 20 случаев, я не вижу смысла как такового удалять их из класса, которому они принадлежат. Подумайте о потере связи и высокой связности (если вы не знаете терминов, поищите их).   -  person Ole V.V.    schedule 19.07.2017


Ответы (1)


С точки зрения передового опыта см. Принцип наименьших привилегий.

Вы должны извлекать встроенные жестко закодированные константы, но вы не должны не помещать все константы в один монолитный класс. Вместо этого разделите константы на контекстуально подходящие классы («несколько файлов меньшего размера») и сохраните эти классы только на уровне пакета, на который нужно правильно ссылаться.

Если значение относится только к одному конкретному классу (также известному как private static final), нет необходимости удалять это значение из класса. Это только создаст больше работы, чтобы сохранить его в другом месте, если на него ссылаются только в этом одном месте.

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

Поскольку вы используете пакеты, рассмотрите возможность использования package-private (static final), чтобы изолировать значения конфигурации для одного пакета, который в них нуждается.

Рассмотрите возможность использования файлов конфигурации/свойств для ввода значений вместо того, чтобы явно жестко кодировать их в классе. В зависимости от ваших потребностей вы можете использовать простые свойства Java или существует множество библиотек/фреймворков, которые могут помочь вам обрабатывать свойства, такие как Весна.

person George Pantazes    schedule 19.07.2017