Группировка связанных констант, совместно используемых классами

В «Эффективной Java», пункт 17, Джош Блох утверждает, что помещение статических членов в интерфейс (и реализация этого интерфейса) — это плохая практика, известная как антишаблон константного интерфейса:

Постоянный шаблон интерфейса — это плохое использование интерфейсов. То, что класс использует некоторые константы внутри, является деталью реализации. Реализация постоянного интерфейса приводит к утечке этой детали реализации в экспортируемый API класса. Для пользователей класса не имеет значения, реализует ли класс постоянный интерфейс. На самом деле, это может даже сбить их с толку. Хуже того, это представляет собой обязательство: если в будущем выпуске класс будет изменен так, что ему больше не нужно будет использовать константы, он все равно должен реализовать интерфейс для обеспечения бинарной совместимости. Если неконечный класс реализует константный интерфейс, все его подклассы будут иметь свои пространства имен, загрязненные константами в интерфейсе.

В библиотеках платформы Java есть несколько постоянных интерфейсов, таких как java.io.ObjectStreamConstants. Эти интерфейсы следует рассматривать как аномалии и не следует эмулировать.

Я почти уверен, что понимаю причины этого и полностью согласен.

Мой вопрос: является ли группировка связанных констант (примечание: они НЕ подходят для перечисления, рассмотрите математический пример связанных констант pi и e) в интерфейсе по сравнению с классом, не создающим экземпляры, хорошей идеей, при условии, что вы только получить доступ к значениям через статические ссылки и статический импорт, скрыть интерфейс от вашего API с помощью модификатора доступа по умолчанию и никогда не реализовывать интерфейс?

Почему или почему нет? Есть ли какие-либо преимущества для их группировки в классе, кроме возможности использовать частный конструктор, чтобы гарантировать, что постоянный тип группировки никогда не будет создан?


person Tom Tresansky    schedule 23.08.2010    source источник


Ответы (1)


Скажем иначе. Нет никаких преимуществ использования интерфейсов для констант. Как вы знаете, интерфейсы предназначены для определения контрактов, а не для констант. Я не вижу проблемы в замене ключевого слова interface на ключевое слово class и использовании, например, полей public static final. Использование интерфейсов для хранения констант никогда не было хорошей идеей. Я думаю, что люди используют этот антипаттерн, потому что они не знают о статическом импорте (он был представлен в Java 5.0) или им лень отправлять свои константы в соответствующие классы. Вместо этого они просто создают один интерфейс и позволяют каждому классу реализовать его.

Редактировать: Кстати, вопрос звучит так: стоит ли смотреть телевизор, глядя на соседний телевизор с помощью телескопа, при условии, что видимость хорошая. Ответ прост - нет, телескоп придуман для других целей. А, и я знаю, что этот пример глупый :)

person Petar Minchev    schedule 23.08.2010