Причины отказа от использования нереализованных интерфейсов для хранения констант?

В своей книге Эффективная Java Джошуа Блох рекомендует не использовать интерфейсы для хранения констант,

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

Его рассуждения имеют для меня смысл, и это, кажется, преобладающая логика всякий раз, когда возникает вопрос, но он упускает из виду сохранение констант в интерфейсах, а затем НЕ их реализацию.

Например,

public interface SomeInterface {
    public static final String FOO = "example";
}

public class SomeOtherClass {
    //notice that this class does not implement anything
    public void foo() {
        thisIsJustAnExample("Designed to be short", SomeInteface.FOO);
    }
}

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

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

5
задан James McMahon 10 June 2011 в 15:48
поделиться