Страницы

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

понедельник, 29 октября 2018 г.

Java 8 interface и abstract class

В Java 8 появилась возможность добавлять неабстрактные реализации методов в интерфейс, используя ключевое слово default, пример:
interface Formula { default double sqrt(int a) { return Math.sqrt(a); } }
В итоге, почти нет отличия между интерфейсом и абстрактным классом. Осталось только добавить объявлять переменные в интерфейсе и сделать возможность объявлять методы не только публичными и будет один в один...
Зачем такое сделали? Для чего? Каково применение такого подхода? В чем профит? Ведь специально интерфейсы и были сделаны для того, чтобы реализацию оставить на программиста, а там всего лишь сделать черновик, набросок. Объясните пожалуйста.


Ответ

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

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

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