Как конечный постоянный класс без экземпляров лучше, чем постоянный интерфейс? - PullRequest
2 голосов
/ 30 декабря 2011

Читая о постоянном интерфейсе антипаттерна, я обнаружил, что конечный константный класс без экземпляров лучше, чем постоянный интерфейс.
Пожалуйста, объясните мне, как?

public interface ConstIfc {
  public static final int constValue = 10;
}

public final class ConstClass {
  private ConstClass{}
  public static final int constValue = 10;
}

Если constValue должен использоваться в UtilClassбез присвоения имени Ifc / Class мы можем их реализовать / расширить.но реализует поддерживает множественное наследование.Так как же лучше?
Примечание: я могу понять статический импорт.

Ответы [ 3 ]

7 голосов
/ 30 декабря 2011

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

На практике, однако, я не думаю, что это имеет слишком большое различие, какой шаблон вы используете.

3 голосов
/ 30 декабря 2011

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

1 голос
/ 30 декабря 2011

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

Я не уверен, что вы подразумеваете под "как лучше расширяется?" , но я думаю, что вам следует избегать наследования / расширения такого рода деталей реализации на несколько классов. Неправильное использование наследования реализации часто приводит к негибкому дизайну. В вашем примере ключевое слово final в ConstClass использует компилятор, чтобы предотвратить это, что невозможно с интерфейсом.

...