9 нових функцій Java 11

Java 11, випущена у вересні 2018 року, є головною новинкою мови Java, оскільки вона представляє собою версію LTS (Long Time Support), яка буде підтримуватися Oracle до 2023 року - і навіть пізніше, якщо ви хочете скористатися широкою підтримкою. Як результат, Java 11 видається обов’язковим випуском на найближчі кілька років. У цій статті я запрошую вас ознайомитись із підбіркою 9 нових функцій, що містяться в JDK 11.

java lang

1. Введіть умовивід для аргументів лямбда-виразів

Ця розробка є продовженням висновку про змінні, додані в Java 10. Тепер можна явно не вказувати тип лямбда-параметрів, просто використовуючи ключове слово var.

Це може бути як збільшення чіткості, стислості та часу при використанні деяких досить важких типів письма. Звичайно, вже не було обов'язковим вказувати тип для лямбда-параметрів, отже, декларація:

є цілком допустимим.

То який сенс у цьому випадку робити висновок про тип? Це корисно, якщо ми хочемо анотувати наші параметри, що неможливо без оголошення типу. У Java 11 ми можемо, наприклад, писати такі вирази, як:

2. Спрощений запуск однофайлових програм

До Java 11 для запуску традиційного HelloWorld.java ми виконали:

Тепер з Java 11 ми можемо безпосередньо запускати програми, що містяться в одному файлі, за допомогою:

Ця функція, крім JShell, доповнює інструменти, доступні для початківців розробників та також дозволяє Oracle розвивати Java до мови, яка є легшою для запуску. Це також може проілюструвати його бажання включити Java у курс мов сценаріїв у майбутньому. Справа, за якою слід !

3. Еволюція API-інтерфейсу клієнта http

Для користувачів клієнтського API HTTP, представленого Java 9 та оновленого Java 10, пам’ятайте, що його реалізація майже повністю переглянута Java 11. Oracle гарантує, що ці зміни не вплинуть на API в одній точці. перспективі рівня, одночасно покращуючи низку технічних моментів після зворотного зв'язку із громадою.

Зараз реалізація повністю асинхронна. Тепер потік даних можна простежити легше - від запитів користувачів до сокетів. Це повинно значно зменшити складність коду та максимізувати можливість повторного використання між HTTP/1.1 та HTTP/2.

Ім'я модуля та пакета API тепер java.net.http.

4. Деякі API

JDK 11 містить ряд нових класів та методів, вбудованих у вже існуючі модулі. Нижче наведений вичерпний огляд, який висвітлює доповнення, які здаються мені найбільш важливими:

5. Управління видимістю атрибутів вкладених класів

Java дозволяє оголошувати кілька класів в одному вихідному файлі, наприклад, вкладених класах. Однак, з точки зору користувача, вони, як правило, вважаються належними до "одного класу". І, отже, користувачі очікують від них спільного режиму доступу до атрибутів або методів батьківського класу. Щоб зберегти ці очікування, компілятори повинні розширити доступ для приватних атрибутів до класів у тому самому пакеті, додавши мости доступу. Виклик приватного члена компілюється у виклик генерованого компілятором методу (getter) у цільовому класі, який, у свою чергу, отримує доступ до призначеного приватного члена.

Наприклад, у випадку класу NestedClass, вкладеного всередину класу NestingClass, який повинен отримати доступ до одного з приватних атрибутів класу хосту:

Компілятор роз'єднує два класи і створює метод відкритого доступу до nestingInt, який використовується класом NestedClass:

Ці мости підривають інкапсуляцію (приватний вже не означає абсолютно те саме) і можуть заплутати користувачів та інструменти. Офіційне уявлення про групу файлів класів, що утворюють гніздо, де партнери по гнізду мають спільний механізм контролю доступу, безпосередньо досягає бажаного результату в більш простому, безпечному та прозорому.

Щоб легко пов’язати вкладені класи та хости, у Java 11 до класів були додані два нові атрибути: NestHost (хост гнізда) та NestMembers (члени гнізда).

Ми також додаємо 3 методи до java.lang.Class:

  • Клас getNestHost ()
  • Клас [] getNestMembers ()
  • boolean isNestmateof (клас)

6. Динамічні константи файлу класу

Ця зміна є розширенням формату файлу класу для підтримки нового пулу констант: CONSTANT_Dynamic.

Виглядає суперечливим, що значення є і постійним, і динамічним. Однак ви можете вважати це остаточним значенням у Java. Значення константи не встановлюється під час компіляції (на відміну від інших констант), але використовує метод завантаження для визначення значення під час виконання. Тому значення є динамічним, але оскільки його значення визначається лише один раз, воно також є постійним.Ця функція представляє новий клас, java.lang.invoke.ConstantBootstraps, з дев'ятьма новими методами.

7. Збирач сміття Epsilon

Збиральник сміття Епсілон є трохи незвичним у тому сенсі, що це не збирає відходи ! Він виділить пам'ять, якщо це необхідно, під час створення нових об'єктів, але не буде повертати будь-який простір, зайнятий об'єктами без посилань. Це повністю пасивна, відверто експериментальна реалізація GC, що не діє, яка є ізольованою зміною, не впливаючи на інші GC і вносячи мінімальні зміни до решти JVM. На даний момент випадки використання цього GC зводяться до тестів продуктивності або розподілу пам'яті, а також завдань з дуже короткими ресурсами.

8. Юнікод 10

JDK 11 взяв до відома появу Unicode 10, і тому підтримує нову версію цього стандарту. Ця версія включає 8 518 нових символів (від біткойнів до смайлів, включаючи традиційні китайські, арабські та буддистські знаки), які ви можете використовувати з Java 11.

9. Видалення модулів

Модулі Java EE та CORBA, по-перше, після того, як застаріли в Java SE 9, були видалені з платформи Java SE та JDK 11. Зачіпаються такі модулі:

  • корба
  • транзакція
  • активація
  • xml.bind
  • xml.ws
  • xml.ws.annotation

Потім модулі JavaFX також були видалені з JDK 11. Ці модулі були частиною попередніх JDK Oracle, але не останніми версіями OpenJDK. Однак не панікуйте! Ці модулі завжди доступні за межами JDK.

Бонус: Про вплив віку та японських імперських традицій на API java.time.chrono

І так, політика має наслідки навіть у найсвятіших святинях, включаючи мову Java! Прийнявши рішення за станом здоров'я поступитися своїм місцем імператора Японії своєму синові Нарухіто, нинішній правитель Акіхіто закінчить еру Хейсей 30 квітня 2019 року. Отже, настане нова ера, сповнена обіцянками та надіями, але також і волосами розробників, оскільки назва майбутньої ери ще не відома. Таким чином, будь-яка комп’ютерна система, що інтегрує японський календар, повинна бути не тільки готова переварити зміну епохи, а й забезпечити механізм оновлення своєї назви, коли вона стане відомою.

На щастя, Oracle продумав усе, оскільки пакети java.time.chrono та java.util з JDK 11 підтримуватимуть цю зміну віку. Сьогодні він отримав загальну назву ("元 号" на японській мові, "NewEra" на інших мовах), і це буде замінено справжнім ім'ям у наступному оновленні. Тому настійно рекомендується не створювати залежностей від цього заповнювача.

Я закликаю тих, хто щодня зазнає наслідків цих геополітичних змін у календарі, роблячи їх роботу набагато болючішою. Про це свідчить гімнастика, необхідна для відновлення назви японської ери, процесу зразкової простоти (тут очікуваним поверненням в Java 11 є рядок “NewEra”):

або навіть більш чітко:

Бажаємо вам гарної пригоди з Java 11! Якщо ви хочете перейти на версії 12 і 13 JDK, не соромтеся звертатися до інших статей нашого досвіду роботи з Java: