Почему не рекомендуется хранить константы в отдельном классе?

Мне сказали (и я видел это выражение в нескольких других местах), что не рекомендуется хранить ваши константы в отдельном классе на Java, чтобы использовать их в других классах. Но я нигде не видел, почему так. Почему я не должен хранить их в своем собственном интерфейсе/классе?


Я пришел из C в Java и в C я просто создавал файл .h, где я определял константы с #define

Ответы

Ответ 1

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

В отличие от этого, наличие констант, связанных с классами, к которым они относятся, является более масштабируемой и читаемой конструкцией.

Ответ 2

Таким образом, вы можете быть инженером и измерительными константами и их местоположениями в качестве технического выбора. Это замечательно и прекрасно, когда вы работаете над критическими критическими системами или прохладными небольшими фрагментами. Однако, как только ваше приложение имеет тенденцию к росту, становится все труднее и труднее понять бизнес-требования и потребности конечного пользователя, отраженные в коде.

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

И помните, что с Java 5 у вас есть enums в вашем распоряжении.

Ответ 3

Отдельный класс констант не является объектно-ориентированным дизайном. В OO класс (или интерфейс) представляет собой контракт, а класс, который содержит только константы, не определяет какой-либо контракт.

Еще одно объектно-ориентированное соображение состоит в том, что отдельный класс констант поощряет злоупотребление наследованием. Наследование должно указывать на то, что класс полностью придерживается контракта, определенного другим классом или интерфейсом. Наследование не должно использоваться только для обмена функциональными возможностями или константами; для чего нужны методы и поля public. Таким образом, этот код неверен:

class SomeApplicationClass
implements ScrollPaneConstants  // Incorrect, import ScrollPaneConstants instead

Ответ 4

Проблема заключается в том, что они должны полностью жить вне исходного кода. Вы должны использовать что-то вроде Apache Commons Config или, по крайней мере, загружать из файла .properties.

Я также хочу отметить, что я интерпретирую "одиночный" в отношении разумного объема. Например, не должно быть одного файла Config для всех разработчиков Java, используемых на серверах Google, с формой запроса для модификации. Вероятно, этого не должно быть сделано для всей базы кода; однако на каждый UOR или пакет является разумной областью, и это тот, который я использую на практике.