Почему кто-то решил использовать статический метод в интерфейсе вместо метода по умолчанию - PullRequest
1 голос
/ 17 марта 2019

Прежде всего, прежде чем пытаться объяснить, что такое интерфейс, статические методы и методы по умолчанию, я не рекомендую это делать, потому что это не вопрос.Я также хотел бы решить, что это НЕ дубликат вопросов, касающихся различий между методами или абстрактными / стандартными.Дело не в этом.

Таким образом, в интерфейсе вы можете использовать методы по умолчанию и статические методы.У обоих есть реализация.Оба могут использоваться в классах, реализующих интерфейс.Основное различие, которое я вижу, состоит в том, что статические методы не могут выполняться через объект, в то время как методы по умолчанию.Однако они оба имеют реализацию и не являются «экземплярами» в том смысле, что два объекта одного типа, которые реализуют интерфейс, не имеют переменных экземпляра, расположенных внутри интерфейса ... потому что все переменные интерфейса являются статическими и конечными.

Итак, единственное существенное различие заключается в том, что один запускается через объект, а другой - только через класс ... но они делают то же самое, зачем беспокоиться о статических методах.В классах вы можете вызывать статические методы через экземпляр объекта.В интерфейсах вы не можете.Кажется, что по умолчанию просто есть дополнительная функциональность, так почему же вы решили использовать статический вместо стандартного?

-Спасибо

1 Ответ

3 голосов
/ 17 марта 2019

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

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

Пример:

interface Counter {
    void add(int i);
    default void increment() {
       this.add(1);
    }
}

Реализация

class ConcreteCounter implements Counter {
    private int value = 0;

    @Override 
    public void add(int i) {
        this.value += i;
    }
}

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

interface Counter {
    static Counter createDefault() {
        return new ConcreteCounter();
    }

    void add(int i);
    default void increment() {
       this.add(1);
    }
}

Этот статический метод не может быть реализован как метод по умолчанию: не было бы смысла создавать счетчик, чтобы иметь возможностьсоздать счетчик.

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

Так что, в принципе, разница между методами по умолчанию иСтатические методы в интерфейсах - это то же различие, что и между статическим методом и методом экземпляра в классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...