Подтвердить что ты не робот

Виртуальные методы расширения в предстоящей версии Java 8

Когда я вижу фрагменты кода, например

  interface A {
      void a();
      void b() default { System.out.println("b"); };
      void c() final { System.out.println("c"); };
  }

У меня есть один вопрос. Разве мы уже не получили достаточно sh * t в Java? Зачем это нужно?

4b9b3361

Ответ 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, которые были подвержены "внешнему миру". Просто синтаксический сахар.