Виртуальные методы расширения в предстоящей версии Java 8
Когда я вижу фрагменты кода, например
interface A {
void a();
void b() default { System.out.println("b"); };
void c() final { System.out.println("c"); };
}
У меня есть один вопрос. Разве мы уже не получили достаточно sh * t в Java? Зачем это нужно?
Ответы
Ответ 1
Я предлагаю вам посмотреть на эту конференцию: http://medianetwork.oracle.com/media/show/16999
Это все объясняет. Самое интересное - позволить интерфейсу развиваться без перезаписи всей вашей кодовой базы. Это ключ к тому, что большая кодовая база может развиваться и не становиться все более калекой.
Ответ 2
Нам нужно это, потому что это сделает парней Scala абсолютно в ярости. У них уже есть аналогичная функциональность в форме "признаков", поэтому теперь им придется сделать эти работы вместе с ними.
Pissing off Scala Ребята - буквально самый высокий приоритет в развитии языка Java.
Ответ 3
Планируется, что Java 8 будет содержать некоторую форму поддержки лямбда и закрытия, что станет большим шагом в модернизации языка Java. Проблема в том, что существующие библиотеки, основанные на интерфейсах, такие как инфраструктура коллекции, не смогут напрямую использовать эти новые функции. Невозможно добавить метод к интерфейсу без нарушения существующих реализаций, они просто не будут компилироваться.
Наличие lambdas, но неспособное легко использовать их со стандартными коллекциями, было бы огромным разочарованием для разработчиков Java. Чтобы интегрировать lambdas в стандартные коллекции, очень хотелось бы использовать такие методы, как forEach
, map
или filter
.
Решение этой проблемы - добавить еще одну функцию, методы расширения, которые определяют реализацию метода по умолчанию в интерфейсе. Существующие подклассы будут использовать метод по умолчанию, но также можно переопределить метод со специализированной и возможной лучшей реализацией.
Более подробную информацию о предложении метода расширения можно найти в предложении 126 Enhancement для Java.
Ответ 4
Это здорово, потому что это позволяет вам, разработчику API, создавать пост-hoc-интерфейсы, не вызывая NoSuchMethodErrors. Он также предоставляет стандартные реализации методов в V2 для классов, скомпилированных против V1; код работает как шарм. Это также позволяет вам переопределять реализацию по умолчанию в классах, скомпилированных по сравнению с V2, как обычно, и делает избыточное число пронумерованных. Я считаю, что это также превосходит методы расширения сайта.
Ответ 5
Я считаю, что концепция "методов расширения" - это не что иное, как просто последний шанс взломать/исправить плохо разработанные API, которые были подвержены "внешнему миру". Просто синтаксический сахар.