- PVSM.RU - https://www.pvsm.ru -

«Жизнь после Java 10»: какие изменения принесет Java 11

Буквально недавно, в конце марта, вышел [1] Java 10. Но в связи с тем, что компания Oracle внесла изменения [2] в релизный цикл (новый релиз каждые полгода), к выходу готовится 11-я версия.

Запуск намечен на сентябрь 2018-го. Мы предлагаем взглянуть на некоторые из грядущих обновлений, о которых известно на сегодняшний день.

«Жизнь после Java 10»: какие изменения принесет Java 11 - 1 [3]
/ фото Markus Spiske [4] PD [5]

Java 10: краткая сводка

Нововведениями десятой версии стали: локальный вывод типов с помощью var [6], улучшения в процессах «сборки мусора» и возможность [7] использовать Graal [8] как основной JIT-компилятор.

Локальный вывод типов с помощью var просили многие разработчики. Теперь можно не вводить типы два раза подряд: сперва для объявления переменной, а затем для конструктора, идущего следом.

var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

Однако решение ввести var получило [9] неоднозначные отзывы участников сообщества. Кто-то высказывался за нововведение и говорил, что дедупликация повышает читабельность кода. Но были и те, кто отмечал [10], что теперь ряд типов переменных (например, connection) не будут очевидными. И хотя IDE теперь смогут показывать их по требованию, в других средах будут возникать проблемы.

Для улучшенной сборки мусора в десятый релиз были включены сразу два изменения: JEP 304 [11] и JEP 307 [12]. JEP 304 улучшил изоляцию кода от различных сборщиков мусора за счет нового интерфейса GC, что позволило быстрее интегрировать сторонние сборщики. JEP 307 же дал возможность «собирать мусор» в несколько потоков.

Что касается нового JIT-компилятора, то он направлен на улучшение производительности JVM. Прежняя версия JVM была написана на C++, однако в рамках проекта [13] Metropolis большую часть JVM перепишут на Java. Экспериментальный компилятор является первым шагом на пути к этой цели.

«Жизнь после Java 10»: какие изменения принесет Java 11 - 2
/ фото Betsy Weber [14] CC [15]

Возможные нововведения в Java 11

В начале осени разработчики планируют представить Java 11. И о части функций, которые могут стать частью релиза, известно уже сегодня. В сети даже идет бурное обсуждение предложенных изменений.

Часть разработчиков недовольна тем, как быстро меняется язык. Один из резидентов Hacker News сказал [16]: «Java превращается в совершенно новый язык. Одна из причин, почему я раньше использовал Java — это обратная совместимость. Если придется учить новый язык программирования каждые 6 месяцев, я выучу что-нибудь другое».

Но есть и те, кто отмечает, что Java наконец-то обзаводится функциями, которых ему не хватало, и которые уже давно были реализованы в других ЯП. Еще один пользователь HN пишет: «Я не использовал Java с начала нулевых и удивлен, что они так долго вводят фичи, которые давно существуют в других языках». Вот некоторые из них.

Изменения в локальном выводе типов

Java 10 уже предоставил возможность использовать var для обозначения типа локальных переменных, перекладывая эту задачу на плечи компилятора. Однако Java 11 идет дальше и делает так, что var можно использовать при объявлении формальных параметров неявно типизированных лямбда-выражений.

За подробным руководством о том, когда и как использовать var, можно обратиться к этой статье [17] на OpenJDK.

Добавление необработанных строковых литералов

Это еще одно дополнение, над которым сейчас ведется работа. В необработанной строке каждый символ читается «как есть», включая символы разрыва. Например, такой строкой может быть разметка HTML или SQL-запрос:

String html = "<html>n" +
              "  <body>n" +
              "    <p>Hello World.</p>n" +
              "  </body>n" +
              "</html>n";

Используя строковый литерал, этот код можно записать следующим образом:

String html = `<html>
                 <body>
                   <p>Hello World.</p>
                 </body>
               </html>
              `;

Для обозначения необработанной строки используется обратный апостроф (`). Если вам нужно прописать апостроф внутри самой строки, то в этом случае для маркировки её границ используются двойные (или тройные, четверные и т. д.) обратные апострофы:

String str = ```This is a raw `string` with ``backticks`` inside```;

Появятся switch-выражения

Сейчас оформление switch выполняется следующим образом:

int val;
switch (str) {
  case "foo": val = 1; break;
  case "bar": val = 2; break;
  case "baz": val = 3; break;
  default: val = -1;
}

С появлением switch-выражений [18], конструкция сократится:

int val = switch (str) {
  case "foo": break 1;
  case "bar": break 2;
  case "baz": break 3;
  default: break -1;
}

При этом если в case встречается только break, возможно использовать упрощенную нотацию:

int val = switch (str) {
  case "foo" -> 1;
  case "bar" -> 2;
  case "baz" -> 3;
  default -> -1;
}

Добавление switch expressions — это шаг вперед на пути к появлению метода сопоставления с образцом [19].

Помимо отмеченных выше, Java может получить и другие изменения. Например, поддержку типов значений или переменных типа в enum. Эти обновления не обязательно войдут в состав Java 11, но, вероятно, ожидать их можно уже в ближайшем будущем.


P.S. О чем еще мы пишем в Первом блоге о корпоративном IaaS:

P.P.S. Несколько материалов из нашего блога на Хабре:

Автор: ИТ-ГРАДовец

Источник [26]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/280535

Ссылки в тексте:

[1] вышел: https://habr.com/company/jugru/blog/351694/

[2] внесла изменения: https://www.infoworld.com/article/3222867/java/the-road-to-java-9-twice-yearly-releases-are-coming.html

[3] Image: https://habr.com/company/it-grad/blog/358810/

[4] Markus Spiske: https://www.flickr.com/photos/markusspiske/37889155476/

[5] PD: https://creativecommons.org/publicdomain/zero/1.0/

[6] локальный вывод типов с помощью var: http://openjdk.java.net/jeps/286

[7] возможность: http://openjdk.java.net/jeps/317

[8] Graal: https://github.com/oracle/graal

[9] получило: http://mail.openjdk.java.net/pipermail/platform-jep-discuss/2016-December/000066.html

[10] отмечал: https://blog.codefx.org/java/java-10-var-type-inference/

[11] JEP 304: http://openjdk.java.net/jeps/304

[12] JEP 307: http://openjdk.java.net/jeps/307

[13] проекта: https://jaxenter.com/openjdk-project-metropolis-137318.html

[14] Betsy Weber: https://www.flickr.com/photos/betsyweber/10350302806/

[15] CC: https://creativecommons.org/licenses/by/2.0/

[16] сказал: https://news.ycombinator.com/item?id=17061026

[17] статье: http://openjdk.java.net/projects/amber/LVTIstyle.html

[18] switch-выражений: http://openjdk.java.net/jeps/325

[19] сопоставления с образцом: https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%86%D0%BE%D0%BC

[20] Облачные технологии в финансовых организациях: правовые вопросы: http://iaas-blog.it-grad.ru/tendencii/legal-issues-of-using-cloud-technologies-by-financial-organizations/

[21] На что обратить внимание при размещении кода и развертывании приложений в облаке: http://iaas-blog.it-grad.ru/tendencii/na-chto-obratit-vnimanie-pri-razmeshhenii-koda-i-razvertyvanii-prilozhenij-v-oblake/

[22] Переезд в облако: трансформация технологий и бизнеса: http://iaas-blog.it-grad.ru/tendencii/pereezd-v-oblako-transformaciya-texnologij-i-biznesa/

[23] UL 3223: представлен новый стандарт сертификации ЦОД: https://habr.com/company/it-grad/blog/353124/

[24] «Интернет стал чуть безопаснее»: комитет IETF утвердил TLS 1.3: https://habr.com/company/it-grad/blog/352668/

[25] Новая старая уязвимость: менеджер паролей Firefox уже 9 лет использует устаревший SHA-1: https://habr.com/company/it-grad/blog/352380/

[26] Источник: https://habr.com/post/358810/?utm_source=habrahabr&utm_medium=rss&utm_campaign=358810