Хабрахабр

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

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

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


/ фото Markus Spiske PD

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

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

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

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

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

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

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


/ фото Betsy Weber CC

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

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

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

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

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

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

За подробным руководством о том, когда и как использовать var, можно обратиться к этой статье на 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-выражений, конструкция сократится:

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 — это шаг вперед на пути к появлению метода сопоставления с образцом.

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

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

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть