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

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

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

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


person Community    schedule 26.01.2012    source источник
comment
Это отличное расширение imo, которое приблизит Java к миру множественного наследования без всех его запутанных деталей реализации.   -  person Perception    schedule 27.01.2012
comment
@Perception ... без всех его запутанных деталей реализации ... как именно?   -  person    schedule 27.01.2012
comment
Цепочка конструкторов, потенциальное столкновение имен, полиморфная неоднозначность, не говоря уже о дополнительной сложности, которую необходимо было бы определить в компиляторе. Все причины, по которым примеси более популярны, чем множественное наследование во многих современных языках, и что эта функция мне больше напоминает.   -  person Perception    schedule 27.01.2012
comment
@Perception Извините, я спросил, как избежать всего этого, а не что это такое.   -  person    schedule 27.01.2012
comment
Нет проблем с цепочкой конструкторов, потому что их нет. И я предполагаю, что они добавят явную область действия для переопределения методов интерфейса, чтобы избежать проблемы именования/полиморфной двусмысленности.   -  person Perception    schedule 27.01.2012
comment
Мало кто использует Java 7, а нас беспокоит Java 8?   -  person Radu Murzea    schedule 27.01.2012
comment
@SoboLAN Как программист на Java я должен беспокоиться о таких вещах.   -  person    schedule 27.01.2012
comment
Это функция, которая понравится разработчикам API и не должна сильно беспокоить обычного программиста. И действительно? Java — один из самых основных современных языков. Черт возьми, даже в c++ за последние несколько лет было больше изменений, чем в java. Давно пора получить хотя бы лямбда-выражения и реальную поддержку закрытия.   -  person Voo    schedule 27.01.2012
comment
@Voo Вы не увидите настоящих или чистых замыканий в JDK8. Помимо столь необходимого синтаксического сахара, поведение отличается от внутренних классов только особым образом.   -  person Tom Hawtin - tackline    schedule 27.01.2012
comment
@Tom Подождите, мы не снимаем ограничение не расширять область действия внешних переменных? Я, конечно, надеюсь, что это неправда, но я не смотрел на jsr. Это было бы разочаровывающе ~   -  person Voo    schedule 27.01.2012
comment
Что ты имеешь в виду? Правила области действия представляют собой анонимные внутренние классы. Нет внутреннего этого. Упомянутые внешние локальные переменные не должны быть помечены как окончательные, но должны использоваться так, как если бы они были (по сути, окончательный вариант является неявным).   -  person Tom Hawtin - tackline    schedule 27.01.2012
comment
@Radu 1. Многие люди используют Java 7. Если вы используете Java EE 6 или разрабатываете основные приложения Java, вы должны использовать его. 2. Чтобы идти в ногу с .NET, Ruby и другими языками, требуется постоянное совершенствование. Независимо от того, насколько медленно вы будете переходить, Java все равно должен выпускать новую версию каждые 18 месяцев или 2 года.   -  person Glen Best    schedule 02.07.2013
comment
@GlenBest Посмотрите на отметку времени моего комментария. Очевидно, что с тех пор все немного изменилось. Что касается того, что Java следует выпускать чаще, чтобы оставаться конкурентоспособным: я полностью согласен. 2 года кажется хорошим балансом для этого. Я надеюсь, что они будут придерживаться этого в будущем, потому что до сих пор это было немного разочаровывающим: 4 с половиной года от Java 6 до Java 7, а теперь будет 2 года и 8 месяцев от Java 7 до Java 8. ....   -  person Radu Murzea    schedule 02.07.2013


Ответы (5)


Предлагаю вам посмотреть эту конференцию: http://medianetwork.oracle.com/media/show/16999

Это все объясняет. Самое интересное, что можно сделать, — позволить интерфейсу развиваться, не переписывая всю кодовую базу. Это ключ к тому, чтобы большая кодовая база развивалась и не становилась все более и более ущербной.

person deadalnix    schedule 03.02.2012

Нам это нужно, потому что это приведет ребят из Scala в ярость. У них уже есть довольно схожая функциональность в виде «черт», поэтому теперь им нужно заставить их работать вместе с ними.

Разозлить ребят из Scala — буквально высший приоритет в разработке языка Java.

person Tom Anderson    schedule 26.01.2012
comment
На самом деле, я думаю, что виртуальные методы расширения — это очень неполная реализация трейтов и может загнать себя в угол. - person Jordão; 16.07.2012

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

Иметь лямбда-выражения, но не иметь возможности легко использовать их со стандартными коллекциями, было бы огромным разочарованием для разработчиков Java. Для интеграции лямбда-выражений в стандартные коллекции весьма желательны такие методы, как forEach, map или filter.

Решение этой проблемы заключается в добавлении еще одной функции, методов расширения, которые определяют реализацию метода по умолчанию в интерфейсе. Существующие подклассы будут использовать метод по умолчанию, но также можно переопределить метод с помощью специализированной и, возможно, лучшей реализации.

Дополнительную информацию о предложении метода расширения можно найти в Предложение по улучшению Java 126.

person Jörn Horstmann    schedule 26.01.2012
comment
И точно по тем же причинам, по которым они будут чрезвычайно полезны для лямбда-выражений, они также помогут другим API. Наконец-то никаких interface X, X2,.. больше нет! О времени. - person Voo; 27.01.2012

Это здорово, потому что позволяет вам, разработчику API, расширять интерфейсы апостериорно, не вызывая NoSuchMethodErrors. Вы также предоставляете реализации по умолчанию для методов в версии 2 для классов, скомпилированных для версии 1; код работает как шарм. Это также позволяет вам переопределить реализацию по умолчанию в классах, скомпилированных для V2, как обычно, и делает нумерованные интерфейсы излишними. Я считаю, что это также лучше, чем методы расширения использования сайта.

person Tassos Bassoukos    schedule 26.01.2012
comment
Нет, это помощь авторам библиотек, которые теперь могут расширять свои интерфейсы (API) в V1.1 без необходимости переименовывать его в 2.0 и перекомпилировать. - person Tassos Bassoukos; 01.02.2012
comment
Ах, извините - это инструмент для авторов библиотек, который облегчает эволюцию API библиотек; авторы библиотек могут расширять свои интерфейсы без необходимости модификации кода пользователями библиотек. - person Tassos Bassoukos; 02.02.2012

Я считаю, что концепция «методов расширения» — это не более чем последний шанс взломать/исправить плохо спроектированные API, которые были открыты «внешнему миру». Просто синтаксический сахар.

person andrew    schedule 26.01.2012
comment
Да, все эти плохо спроектированные API, дизайнеры которых не были одарены ясновидением или не могли на самом деле спроектировать свой интерфейс по-другому, потому что некоторых функций еще не было;) - person Voo; 27.01.2012
comment
Разработчикам API @Voo не нужно быть ясновидящим, чтобы понять, что могут быть методы, которые необходимо добавить позже. Можно было бы использовать абстрактные классы, хотя недостаток языка в том, что он не позволяет определять чистый абстрактный класс без добавления нежелательного багажа бинарной совместимости интерфейса. - person Tom Hawtin - tackline; 27.01.2012
comment
О, методы защиты на самом деле. - person Tom Hawtin - tackline; 27.01.2012
comment
@TomHawtin Использование абстрактных классов не только проблематично с практической точки зрения, но и достаточно часто плохо кодирует стиль ООП. Так что ясно, что это не решение для многих ситуаций. - person Voo; 27.01.2012
comment
@Voo Было бы идеально для коллекций, JDBC и т. Д. Что касается плохого стиля, то явно что-то не так со стилем, если он вызывает такого рода проблемы. Ой, а какие практические проблемы?? AbstractCollection должен уйти, а ты используешь java.lang.reflect.Proxy, но кого это волнует. - person Tom Hawtin - tackline; 27.01.2012
comment
@TomHawtin Практические проблемы? Ну, это делает невозможным реализацию 2+ интерфейсов, что, безусловно, ограничивает. И в целом интерфейсы используются гораздо чаще, чем абстрактные классы, поэтому изменение приветствуется для многих людей, и люди, которые предпочитают абстрактные классы, никак не затронуты. Это изменение просто устраняет одну из самых неприятных проблем с интерфейсами (теперь давайте также укажем конструкторы, и я был бы счастлив). - person Voo; 27.01.2012
comment
Реализовать 2+ интерфейса? Часто ли вы хотите наследовать тип Collection или Statement вместе с другим классом? - person Tom Hawtin - tackline; 27.01.2012