Что нового в Java 14

JDK 14

17 марта состоялся релиз JDK 14. Релиз не LTS, но содержит несколько интересных нововведений. Давайте по ним пройдемся.

Информативные NullPointerException

Наконец-то это случилось. Теперь станет чуточку понятнее, что же пошло не так

class Bar{
   void print(){
       System.out.println("Bar");
   }
}


class Foo{
   Bar bar;
}

..

Foo foo = new Foo();
foo.bar.print();
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Main$Bar.print()" because "<local2>.bar" is null

    at Main.main(Main.java:18)

Запускать нужно с флагами -XX:+ShowCodeDetailsInExceptionMessages --enable-preview --source 14

Новый switch-case

С новой версией появляется новая вариация оператора switch. Основные особенности — это возможность указания нескольких выражений в case и ошибка компиляции, в случае если не определены все исходы. Вот несколько примеров, чтобы стало понятнее:

Множественные варианты:

switch (animal) {
   case CAT -> System.out.println("Cat");
   case COW, DOG ->  System.out.println("Cow or Dog");
}

Возврат значения из switch:

var result =  switch (animal) {
     case CAT -> "Cat";
     case COW, DOG ->  "Cow or Dog";
     default -> "I don't know";
 };

Ошибка компиляции, если в case не обработаны все возможные исходы. Работает только в случае, если мы возвращаем значение из switch:

var result = switch (animal) {
     case CAT -> "Cat";
     case COW ->  "Cow";
}

Получаем исключение:

Main.java:10: error: the switch expression does not cover all possible input values
      switch (animal) {
                    ^

Значение по-умолчанию:

switch (animal) {
  case CAT -> System.out.println("Cat");
  case COW, DOG ->  System.out.println("Cow or Dog");
  default -> System.out.println("I don't know");
}

Records

Новая концепция в Java. По сути Record — это класс, предназначение которого хранить только данные, без какого либо поведения (аналог структуры). Для этого класса автоматически генерируются методы доступа, equals, hashCode и прочие методы. 

public record Address(String city, String street)

Компилировать необходимо с опциями —enable-preview —release 14

Текстовые блоки

Мы все знаем насколько неудобно определять многострочные текстовые константы внутри кода. Возможность писать текстовые блоки появилась в ещё в JDK 13й версии, но фича до сих пор в стадии Preview, хотя и Second. Добавилось лишь пару небольших изменений 

String sql = """  
    SELECT * FROM “person”    
    WHERE id > 42             
    ORDER BY “created”    """;

Pattern matching для instance of

Тоже полезная штука. Приводит объект к нужному типу и позволяет им пользоваться без всяких преобразований.

if (obj instanceof Foo f) 
{    
   //without cast  
    f.bar() 
}

Удаление CMS GC

Concurrent Mark Sweep (CMS) Garbage Collector недоступен начиная с JDK 14. При попытке использовать его JVM выдаст предупреждение и запустит виртуальную машину с дефолтным GC

Остальные нововведения можно посмотреть тут 

Итого:

В языке появляются новые удобные фичи, которые уже есть в других JVM-языках (Kotlin и, возможно, Scala) что не может не радовать. Например

Также в процессе брожения по документации я наткнулся на упоминание sealed классов (sealed в Kotlin). Как знать, быть может в скором будущем мы будем мигрировать обратно с Kotlin на Java 🙂

Оставить комментарий

Ваш адрес email не будет опубликован.