Является ли применение статических методов в интерфейсах хорошей практикой? - PullRequest
2 голосов
/ 10 июля 2019

Допустим, у меня есть метод getAverageDifficulty в моем классе Difficulty, который выглядит следующим образом:

public static Float getAverageDifficulty (List<Difficulty> difficultyList) {

    ...
    return average;

}

Мой метод, очевидно, должен быть статическим, поскольку нет смысла требовать экземпляр Difficulty.Теперь предположим, что я использую интерфейс IDifficulty, чтобы я мог изменить свою реализацию позже.Очевидно, я хочу, чтобы мой метод getAverageDifficulty был доступен из IDifficulty, и, поскольку я не могу объявить абстрактный статический метод, очевидным вариантом является размещение getAverageDifficulty непосредственно в моем интерфейсе.Мой вопрос: я делаю ошибку, помещая этот статический метод в мой интерфейс, который содержит другие Difficulty методы, ожидающие реализации?Разве я не должен смешивать статические и "нормальные" интерфейсные абстрактные методы?Должен ли я создать DifficultyHelper класс и поместить туда свой метод?

Ответы [ 2 ]

3 голосов
/ 10 июля 2019

В конечном счете, это вопрос стиля. Однако, если единственная цель вспомогательного класса состоит в том, чтобы удерживать этот метод (и, возможно, несколько похожих), то вы сохраните себе одно определение класса, поместив их в интерфейс:

Начиная с Java 8, ограничение, заключающееся в том, что интерфейсы не могут содержать статические методы, было устранено, поэтому, как правило, нет особых причин предоставлять для интерфейса непостижимый сопутствующий класс [Effective Java, 3rd edition].

0 голосов
/ 10 июля 2019

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

...