Глобальные переменные в интерфейсе против синглтона - PullRequest
0 голосов
/ 27 декабря 2018

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

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

Я прочитал мысль, что объявление переменных в интерфейсах - плохой дизайн, так почему это так и каков лучший способ создания глобальных переменных?

1 Ответ

0 голосов
/ 27 декабря 2018

Использование интерфейса только для хранения констант является запахом кода, согласно правилу сонара :

Constants should not be defined in interfaces (squid:S1214)

По словам автора Джошуа Блоха«Эффективная Java»: постоянный шаблон интерфейса - плохое использование интерфейсов.

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

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

все его подклассы будут иметь свои пространства имен, загрязненные константами в интерфейсе.

...