Я когда-то развлекался так на собеседованиях: спрашивал, в чем отличие абстрактного класса от интерфейса в php, сначала было весело - потом надоело.Мне кажется будет крайне сложно найти такой пример где нужен будет именно интерфейс с дефолт методами(вместо абстрактного класса). Эта всеобщая любовь к интерфейсам(относительно абстрактных классов) немного туманит рассуждения.
хренасене мешает2) ты обновил библиотеку и в новой версии появился метод x()
На такой вопрос я бы от senior-а или продвинутого миддла ожидал ответа, поясняющего семантическую разницу (abstract class = is-a, interface = can, ну или что-то эквивалентное типа abstract class = type, interface = feature), а рассуждения на тему множественного наследования или ключевых слов - это уровень джуниора или начинающего миддла.Я когда-то развлекался так на собеседованиях: спрашивал, в чем отличие абстрактного класса от интерфейса в php, сначала было весело - потом надоело.
defaults methods не позволят это сделать: массив с событиями-то — состояние.с default methods как-то аккуратнее.
Блин, да.defaults methods не позволят это сделать: массив с событиями-то — состояние.
Не впервые. Generic-и с type erasure и лезущим отовсюду Object - тоже, по большому счету, хак.default methods — это своего рода хак
Тогда интерфейсы становятся не нужны. Слишком революционно для Java, C++ какой-то получаетсяМожно было бы позволить наследовать несколько абстрактных классов
Да, мне почти во всех юзкейсах трейтов хватило бы дефолтных методов на интерфейсе.Я, кстати, считаю трейты (в таком виде, в каком они реализованы в PHP) ошибкой дизайна. Было бы намного лучше, если бы реализовали Java 8 default methods в интерфейсах (кажется, все разумные случаи использования трейтов сводятся к некоей дефолтной реализации определенного интерфейса).
Мне кажется будет крайне сложно найти такой пример где нужен будет именно интерфейс с дефолт методами(вместо абстрактного класса). Эта всеобщая любовь к интерфейсам(относительно абстрактных классов) немного туманит рассуждения.
class ConcreteApplication extends [abstract] BaseApplication implements MonitorableInterface, LoggableInterface, DebuggableInterface {
use LoggerAwareTrait, MonitoringStatsTrait, ExposeEndpointsTrait...
}
Я тут поговорил с ява-девелопером, и он говорит, что ноги у дефолт-методов растут из другого места - они появились для того, что бы реализовать лямбды на классах нормально внутри JVM не ломая совместимость, типа, всякие Runnable { pubic run() } транслируются в свежей яве более адекватно внутри в лямбда-класс.Я уже как-то говорил, что мне кажется, default methods — это своего рода хак. Можно было бы позволить наследовать несколько абстрактных классов, если они без состояния. Добавил состояние — нарушил BC. Или на крайняк ввести ключевое слово типа «primary abstract class» (или наоборот — «stateless abstract class»), которое бы позволяло разделать абстрактные классы на два типа.
Да и вообще, в реализации Java это именно «методы по умолчанию»: их нельзя сделать final, т.е. их всегда можно переопределить. Мне это не очень понятно.
Да, они это сделали чтобы не ломать обратную совместимость. Но границы между stateless abstract class и interface with default methods стираются. А то почему они именно default и почему нельзя их сделать final — этот вопрос так и повисает в воздухе.Я тут поговорил с ява-девелопером, и он говорит, что ноги у дефолт-методов растут из другого места - они появились для того, что бы реализовать лямбды на классах нормально внутри JVM не ломая совместимость, типа, всякие Runnable { pubic run() } транслируются в свежей яве более адекватно внутри в лямбда-класс.