
Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.
Очікується, що нова версія Java 9 вийде вже 27 липня 2017 року. Давайте розберемося, які функції з’являться, і розповімо, навіщо вони потрібні.
Ось список важливих нововведень Java 9 :
- JShell.
- Immutable List, Set і Map з коробки.
- Private методи в інтерфейсах.
- Модульна система.
- Поліпшення API.
- Зміни в try-with-resources.
- Реактивне програмування.
- Diamond-оператор для анонімних класів.
- Додаткові поліпшення в класах.
- Поліпшення Stream API.
- Розширені анотації @Deprecated.
- HTTP/2 клієнт.
- API чутливих зображень.
- Різне.
За допомогою прикладів розповімо детальніше про ці функції.
JShell
REPL (англ. read-eval-print loop) – система для інтерактивного програмування в консолі. Якщо користувач вводить рядок коду, в консолі з’являється результат його виконання і цей процес повторюється.
Oracle представила новий інструмент “JShell”. Він необхідний для тестування і використання в консолі різних конструкцій, наприклад класів, інтерфейсів, перерахувань, об’єктів, операторів і т. д.
До речі, вже зараз можна завантажити бета-версію JDK 9, скачавши її з офіційного сайту.
Простий приклад роботи з JShell:
G:>jshell| Welcome to JShell -- Version 9 - ea| For an introduction type: /help intro jshell> int a = 10 a ==> 10jshell> System.out.println ("a value = " + a) a value = 10
Незмінні об’єкти List, Set і Map “з коробки”
Oracle представила декілька зручних методів для створення незмінних List, Set, Map і Map.Entry
об’єктів без використання додаткових класів
У Java SE 8 і в ранніх версіях ми можемо використати Collections.unmodifiableXXX
для створення незмінних об’єктів колекцій. Якщо ми хочемо створити Immutable List
, то використовуватимемо Collections.unmodifiableList
метод.
Проте це незручно, тому Oracle додала декілька допоміжних методів в інтерфейси List, Set і Map.
List і Set інтерфейси мають of ()
методи. Приклади їх використання можна побачити нижче:
List immutableList = List.of (); // порожній незмінний списокList immutableList = List.of ("one"," two"," three"); // незмінний список, що містить інформацію
Map має два набори методів: of ()
методи і ofEntries ()
методи для створення об’єктів Immutable Map і Map.Entry.
jshell> Map emptyImmutableMap = Map.of () emptyImmutableMap ==> {} // порожнє незмінне отображениеjshell> Map nonemptyImmutableMap = Map.of (1, " one", 2, " two", 3, " three") nonemptyImmutableMap ==> {2=two, 3=three, 1=one} // незмінне відображення
Private-методи в інтерфейсах
У Java 8 ми можемо забезпечувати реалізацію методу в інтерфейсах, використовуючи default і static методи. Проте ми не можемо створювати private методи в інтерфейсах.
Для уникнення нагромадження і надлишку коду Oracle збирається додати private-методи в інтерфейси Java SE 9. Починаючи з дев’ятої версії, ми також зможемо створювати private static-методи в інтерфейсах за допомогою private.
Створення реалізації методу для інтерфейсу за умовчанням:
public interface Card{ private Long createCardID (){ // Реалізація методу відбувається тут. } private static void displayCardDetails (){ // Реалізація методу відбувається тут. }}
Модульна система
Ось деякі з функцій цієї системи:
- модульна JDK;
- модульний вихідний код Java;
- модульні run-time зображення;
- інкапсуляція внутрішніх API;
- система модульної платформи.
JDK 9 поставляється із 92 модулями. Ми можемо використати їх або створити свої, наприклад:
module com.foo.bar { }
Кожен модуль має ім’я, пов’язаний код та інші ресурси.
Поліпшення API
Очікується, що в Java SE 9 будуть зроблені поліпшення в частині API. Будуть додано декілька нових класів і методів для зручнішого керування діями операційної системи.
Два нові інтерфейси в Process API:
- java.lang.ProcessHandle;
- java.lang.ProcessHandle.Info.
Приклад Process API:
ProcessHandle currentProcess = ProcessHandle.current ();System.out.println ("Current Process Id: = " + currentProcess.getPid());
Тут нами був створений об’єкт типу ProcessHandle для роботи з діями в операційній системі.
Зміни в try-with-resources
Як ми знаємо, в Java SE 7 з’явилася нова конструкція обробки винятків Try-With-Resources для автоматичного керування ресурсами. У Java SE 9 збираються внести декілька змін до цієї конструкції, щоб підвищити читаність.
Приклад в Java SE 7:
void testARM_Before_Java9 () throws IOException{ BufferedReader reader1 = new BufferedReader (new FileReader ("journaldev.txt")); try (BufferedReader reader2 = reader1) { System.out.println (reader2.readLine()); } }
Приклад в Java 9:
void testARM_Java9 () throws IOException{ BufferedReader reader1 = new BufferedReader (new FileReader ("journaldev.txt")); try (reader1) { System.out.println (reader1.readLine()); }}
Можна помітити, що в новій версії, після try не обов’язково оголошувати нову змінну.
Нововведення в CompletableFuture API
У Java 9 Oracle також збирається поліпшити CompletableFuture API для розв’язання проблем, що з’явилися в Java SE 8. У планах додати затримки і тайм-аути, додаткові методи і поліпшити підкласи.
Приклад:
Executor exe = CompletableFuture.delayedExecutor (50l, TimeUnit.SECONDS);
Тут delayedExecutor ()
– static метод, використовуваний для повернення виконавця, після заданої затримки.
Реактивне програмування
Для тих, хто ще не ознайомлений з парадигмою реактивного програмування, радимо прочитати наш вступ у тему з прикладами.
У Scala, Play, Akka вже були інтегровані reactive streams. Oracle вирішила додати Reactive Streams API в Java SE 9.
Java SE 9 Reactive Streams API – фреймворк для реалізації асинхронних, масштабованих і паралельних додатків з використанням Java.
У Java SE 9 з’являться наступні API:
- java.util.concurrent.Flow;
- java.util.concurrent.Flow.Publisher;
- java.util.concurrent.Flow.Subscriber;
- java.util.concurrent.Flow.Processor.
Diamond-оператор для анонімних класів
Припустимо, що у нас є клас Box
і ми хочемо зробити його анонімним.
Ось як виглядає цей процес в Java 8 :
Box createBox (T content){ // Треба поставити 'T' тут return new Box(content) { };}
Хіба не очевидно, що Box має бути типу T? Компілятор у разі неанонімного класу вибрав би потрібний тип, то чому б не зробити те саме з анонімним?
Проблема полягає не у визначальних (англ. non-denotable) типах, які розпізнаються компілятором, а JVM – ні. Такий випадок може бути оброблений компілятором, але питання – як коректно передати його JVM.
Тому Diamond оператор не допускався у використанні з анонімними класами. Тепер це стало можливим.
Ось як це виглядає в Java 9:
class inJava{ Box createBox (T content) { // Java 9 виводить 'T', тому що цей тип означає return new Box<>(content) { }; } Box<?> createCrazyBox (Object content) { List <?> innerList = Arrays.asList (content); // А цей тип не виводиться, оскільки не можемо його позначити:
// return new Box<>(innerList) { }; // Замість цього означаємо той тип, який нам потрібний: return new Box<List<?>>(innerList) { }; }}
Додаткові поліпшення в класах
У Java SE 9 Oracle додала декілька корисних методів в java.util.Optional.
Ось наприклад як працює метод stream:
Stream emp = getEmployee (id);Stream empStream = emp.flatMap (Optional::stream);
Тут використовується метод Optional.stream (), який конвертує все в потік Employee.
Поліпшення Stream API
У новій версії з’являться як мінімум чотири методи java.util.Stream
. Як і stream, усі вони будуть стандартними. Найбільш важливими є dropWhile
і takeWhile
методи.
Якщо Ви знайомі з мовою Scala або функціональним програмуванням, то обов’язково дізнаєтеся про ці методи.
Простий додаток stream:
jshell> Stream.of (1,2,3,4,5,6,7,8,9,10).takeWhile (i -> i < 5 ).forEach (System.out::println);
Розширені анотації @Deprecated
До Java 9 @Deprecated – інтерфейс-маркер. Багато розробників пропонували Oracle поліпшити інформування про застарілі можливості API. Їх почули і додали можливості роботи із застарілими API. Наприклад, з’явилися інструменти для їх аналізу – forRemoval і since.
HTTP/2 клієнт
Oracle планує викотити новий HTTP- клієнт для підтримки протоколів HTTP/2 і WebSocket. Вони замінюють HttpURLConnection API на новий, продуктивніший.
Новий API буде представлений у пакеті “java.net.http”. Він підтримує як синхронний, так і асинхронний режими.
Новий API можна подивитися на офіційному сайті Oracle в розділі документації.
Приклад HTTP/2 Client:
jshell> import java.net.http.*jshell> import static java.net.http.HttpRequest.*jshell> import static java.net.http.HttpResponse.*jshell> URI uri = new URI ("http://rams4java.blogspot.co.uk/2016/05/java-news.html") uri ==> http://rams4java.blogspot.co.uk/2016/05/java-news.htmljshell> HttpResponse response = HttpRequest.create (uri).body (noBody()).GET ().response () response ==> java.net.http.HttpResponseImpl@79efed2djshell> System.out.println ("Response was " + response.body (asString()))
API для зображень з різними дозволами
Oracle планує впровадити новий API для зображень з різними дозволами. Найбільш важливим є інтерфейс MultiResolutionImage доступний в пакеті java.awt.image
.
Інші зміни
Крім вищеперелічених змін, очікуються й інші. Ось лише деякі з них:
- Зміни в Garbage Collector.
- Зміни в API Stack – Walking.
- Фільтр вхідних даних серіалізації.
- Відключення API аплета.
- Зміни конкатенації рядків.
- Поліпшення в MethodHandle.
- Логування.
- Парсер API для Nashorn.
- Пошук по JavaDoc.
- HTML5 JavaDoc.
Переклад статті “Java 9 Features with Examples”
Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?