Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Java 8 interface и abstract class

#java #интерфейс #java_8


В Java 8 появилась возможность добавлять неабстрактные реализации методов в интерфейс,
используя ключевое слово default, пример:

interface Formula {    
    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}


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

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


Ответы

Ответ 1



Чтобы, например, можно было не париться с вещами такого рода, переопределяя их только там, где это даст выигрыш: void add(X element); default void addAll(Collection elements) { elements.forEach(this::add); } кроме того, абстрактный класс сужает возможности наследника, а интерфейс позволяет их расширить: отнаследовавшись от абстрактного класса, нельзя не унести с ним всю его реализацию и нельзя взять еще какую-то. В принципе, описанное в последнем абзаце - шаг в сторону множественного наследования, которое во многих случаях будет указывать на корявую архитектуру, но, тем не менее, добавление такого функционала не вводит новые ограничения, а только расширяет возможности для применения.

Ответ 2



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

Ответ 3



Например, вы можете использовать это в качестве ограниченной реализации микс-инов. Имея интерфейс с имплементацией метода, вы можете легко «подмешивать» функциональность к классам без того, чтобы копировать код. Микс-ины полезны тем, что открывают возможность привносить готовый код в ваш класс без множественного наследования и связанных с ним довольно тяжёлых проблем.

Ответ 4



На мой взгляд, основная причина, почему добавили default методы в интерфейс - возможность расширения интерфейса без необходимости переписывания классов, реализующих интерфейс. Например, используя JDK 1.6 ты написал свой класс имплементирующий интерфейс Collection, потом решил обновить джаву до 1.8. Если бы не было default методов в интерфейсах, у тебя бы проект не собрался и тебе пришлось бы реализовывать removeIf, spliterator, stream и т.д. Т.е. изначально default методы нужны были самим разработчикам 8-ой джавы. А мы теперь можем использовать для того же. Плюс в отличии от абстрактных классов, возможности default методов в интерфейсах ограничены, т.к. они не могут оперировать с полями, разве что читать статичные.

Ответ 5



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

Комментариев нет:

Отправить комментарий