• Вышло два новых черновика JEP: Record and Array Patterns (Preview) и Pattern Matching for switch
(Preview).
В первом JEP'е предлагается ввести в язык паттерны записей и паттерны массивов. Паттерны записей будут выглядеть следующим образом:
record Point(int x, int y) {} ... if (o instanceof Point(int x, int y)) { System.out.println(x + y); }
Паттерны могут быть вложенными:
if (r instanceof Rectangle(ColoredPoint(Point p, Color c), ColoredPoint r)) { System.out.println(c); }
Паттерны массивов выглядят так:
if (o instanceof String[] { String s1, String s2, ... }) {
System.out.println(s1 + s2);
}
Паттерн на примере выше срабатывает для массивов длины 2 или более. Если нужен паттерн строгой длины 2, то многоточие не нужно указывать:
if (o instanceof String[] { String s1, String s2 }) {
System.out.println(s1 + s2);
}
Есть возможность осуществлять паттерн-матчинг по многомерным массивам. Также можно вкладывать паттерны массивов в паттерны записей и наоборот.
Во втором JEP'е предлагается ввести паттерн-матчинг по типу для оператора switch
, и это будет выглядеть следующим образом:
Object o = ... return switch (o) { case Integer i -> String.format("int %d", i); case Byte b -> String.format("byte %d", b); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); };
Если пользователю нужен матчинг null
, то придётся указывать отдельную ветку:
switch (o) { case null -> System.out.println("Null"); case String s -> System.out.println("String: " + s); }
Если не указывать явную ветку case null
и в switch
передастся нулевой объект, то будет выбрасываться NullPointerException
, даже если будет присутствовать ветка default
:
String s = null; switch (s) { // will throw NPE case "Foo", "Bar" -> System.out.println("My favourite!"); default -> System.out.println("Acceptable..."); }
Чтобы ветка default
покрывала null
, нужно будет использовать паттерн null, default
:
String s = null; switch (s) { case "Foo", "Bar" -> System.out.println("My favourite!"); case null, default -> System.out.println("Acceptable..."); }
Паттерн null
можно будет также объединять и с паттерном по типу:
return switch (o) { case Integer i -> String.format("int %d", i); case Byte b -> String.format("byte %d", b); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case null, String s -> String.format("String %s", s); default -> o.toString(); };
В первой итерации поддержки смешанных паттернов (паттернов по типу и константных паттернов в одном switch
) не будет:
switch (s) { case "Hello world" -> System.out.println("Hello back"); case String s -> // Error System.out.println("Nothing?"); }
switch
также будет поддерживать условные паттерны. Для этого предлагается ввести охранные паттерны вида true(boolean expr)
и false(boolean expr)
:
Shape s = ... switch (s) { case Triangle t & true(t.calculateArea() > 100) -> System.out.println("Large Triangle"); default -> System.out.println("A shape (including small triangles"); }
Если оба JEP'а будет реализованы вместе, то первый будет дополнять возможности второго. Так, все паттерны по записям и массивам можно будет использовать и в ветках switch
(в том числе вложенные).
• Вышел первый релиз-кандидат языка Scala 3: Scala 3.0.0-RC1. В эту версию попало более 400 пулл-реквестов от контрибьюторов с прошлого релиза 3.0.0-M3.
Scala 3, разработка которой более 5 лет ведётся в проекте Dotty – это полная переработка Scala 2, но в значительной части с ней совместимая: большая часть кода на Scala 2 остаётся валидным кодом для компилятора Scala 3, а для остального кода есть гид по миграции.
Также вышло обновление Scala 2.13.5. В него попала поддержка последних версий Java вплоть до ещё не вышедшей Java 17, поддержка Scala 3.0.0-RC1, более безопасный паттерн-матчинг и другие изменения.
• Опубликованы результаты опроса Jakarta EE, который проводился с сентября 2020 по февраль 2021 года. В нём 684 респондента ответили на вопросы относительно использования технологий Java EE / JakartaEE. Из интересных результатов опроса следующие факты:
- Самый используемый сервер приложений – это RedHat WildFly, а самый ненавистный – IBM WebSphere.
- Наиболее часто используемые API: JPA, CDI и JAX-RS.
- Наиболее часто используемые библиотеки: Hibernate, Weld и Hibernate Validator.
- MicroProfile попробовало 32% опрошенных. Это на 16% больше, чем 2 года назад.
- Самые популярные продукты MicroProfile: Quarkus, WildFly и Payara Micro.
• Была объявлена виртуальная конференция JakartaOne Livestream на русском, которая пройдёт 31 марта 2021 года.
• Вышли новые ранние сборки JDK: JDK 17-ea+11, JDK 17-panama+2-51.
• Вышлая версия 1.0 библиотеки FlatLaf для кроссплатформенного Look and Feel в приложениях на Swing.
• В официальной документации Android обнаружили, что аннотация @Deprecated
помечена как Deprecated. Эта ошибка возникла из-за того, что в JavaDoc аннотации присутствовал код {@code @deprecated}
, который сигнализировал парсеру документации добавить "пропущенную" аннотацию @Deprecated
. Баг уже был устранён.