Основные новшества Java 9, которые, на мой взгляд, наиболее актуальны.
Здоровая критика и дополнения приветствуются. Есть текстовый документ, где всё это расписано немного подробнее.
2. ●
Модульная система - проект Jigsaw
●
Интерпретатор Jshell
●
Ahead-of-Time компиляция
●
Реактивные стримы
●
Усовершенствования Process API
●
Images API - картинки с несколькими размерами
●
Фабричные методы коллекций
●
Клиент HTTP 2
●
Тесная интеграция с рабочим столом
●
И многое другое
Java 9: июль 2017
3. ●
Самое важное новшество в Java 9
●
Планировалась ещё в Java 7
●
Реализация длилась около 10 лет
●
Все библиотеки сгруппированы в модули
●
Используются только необходимые
●
Ещё один уровень инкапсуляции — публичные
классы видны, если это разрешено в модуле
Модульная система
проект Jigsaw
6. ●
Некоторые библиотеки, например com.sun.* не
будут доступны по умолчанию.
●
Введение модульности повлечёт за собой
внесение изменений в предыдущий код.
●
Усложнена система видимостей - теперь помимо
классов и пакетов есть ещё и модули.
Неудобства,
недостатки
7. Консоль, в которой можно объявлять
переменные, писать выражения, выполнять
команды и тут же получать результат.
●
Дружелюбный для начинающих
●
Удобный для разработчиков
●
Автоматическое дополнение по клавише tab
●
Сохранение/загрузка команд
●
Не нужно ставить «;»
JShell – интерпретатор Java 9
8. Было: для проверки фрагмента кода создавался
класс с методом main, или тестовый класс.
●
Для начинающих это шок - много непонятного
кода чтобы вывести на экран "Hello World!".
●
Если громоздкое приложение - Spring, Hibernate,
в добавок, код на JS - проверять кусочек кода
очень дорого, подчас, минута-две и более
ожидания, пока всё поднимется.
JShell
9. ●
Компиляция непосредственно в машинный код
●
Исполняемому файлу не нужны JRE, JDK
●
Скорость выполнения близка к Си
●
Невозможность декомпиляции
Ahead-of-Time компиляция
11. Утилита jaotc очень тщательно анализирует
исходники (что невозможно при JIT компиляции) и
переводит их в машинный код.
Даже при AoT программа, написанная на Java
будет работать хоть немножко, на какие-то доли
процента, но медленнее чем аналогичная
программа на Си. Причина - безопасность типов,
проверки массивов на переполнение и прочие
вещи, которые в Си могут запросто завалить не
только работающее приложение, но и всю
систему.
12. Сейчас гарантируется только покрытие модуля
java.base, то есть, объектов, потоков и структур
данных. И то, только для 64-битных систем Linux.
Вопрос создания таким образом даже оконного
приложения под большим вопросом.
Решение идеально для встраиваемых и
мобильных систем, поскольку, динамическая
компиляция потребляет ресурсы процессора и
аккумулятора. В iOS запрещена динамическая
загрузка кода, на Java было невозможно писать
программы под телефоны от Apple.
13. Асинхронная обработка потоков данных.
Интерфейсы java.util.concurrent.Flow:
Flow.Processor<T,R>
Flow.Publisher<T>
Flow.Subscriber<T>
Flow.Subscription
Издатель производит данные, потребляемые
несколькими подписчиками. Подписки
связывают издателей и подписчиков.
Перспектива использования в распределённых
приложениях очень реальная.
Reactive Streams API
Publish Subscribe Framework
14. Информацию о процессе доступна с помощью
java.lang.ProcessHandle:
●
pid
●
вся информация
●
команда запуска
●
время запуска
●
суммарное процессорное время
●
имя пользователя
Так же можно уничтожать процессы. Имеется
возможность повесить событие, которое будет
происходить после завершения процесса:
ProcessHandle.onExit().
Process API
15. Интерфейс
java.awt.image.MultiResolutionImage хранит
картинки с несколькими размерами. Возвращает
весь список картинок, или, зная габариты,
подбирает наиболее подходящую.
Применение: поддержка графики на различных
мониторах. В зависимости от разрешения
экрана и размера окна класс
java.awt.Graphics будет получать нужный
вариант картинки.
Картинки с несколькими
размерами в Images API
17. Доработка интерфейсов была начата ещё в
Java 8. Были добавлены статические
методы и методы по умолчанию. Теперь
есть ещё и приватные методы.
Повышают чистоту и ясность кода.
Статические приватные классы доступны
только в пределах интерфейса, обычные
же можно вызывать из экземпляра
интерфейса.
Private методы в интерфейсах
18. Команда try-с-ресурсами была введена в Java 7.
В этом блоке объявляется переменная, и о её
закрытии и освобождении ресурсов можно не
беспокоиться, всё произойдёт автоматически.
Такая запись была громоздкой:
void printFileJava7() throws IOException {
try (FileInputStream myInput = new
FileInputStream("myfile.txt")) {
int data = myInput.read();
while(data != -1){
System.out.print((char) data);
data = myInput.read();
}
}
}
Try-с-ресурсами
19. В Java 9 такую переменную можно объявить за
пределами блока try, главное, чтобы она была
финальной, или вела себя как финальная.
void printFileJava9() throws IOException {
final FileInputStream myInput = new
FileInputStream("myfile.txt")
try (myInput) {
int data = myInput.read();
while(data != -1){
System.out.print((char) data);
data = myInput.read();
}
}
}
Try-с-ресурсами
20. Diamond operator упрощает запись
параметризованных данных.
List<String> preJava7 = new ArrayList<String>();
List<String> java7 = new ArrayList<>();
Повышается читабельность кода, но такая запись
не работала с анонимными классами. Теперь и
это в прошлом:
List<String> list = new ArrayList<>(){ ... };
Улучшения для алмазного
оператора
21. Аннотация @Deprecated используется для
пометок в Java API устаревшего или
неверно работающего кода.
Теперь у аннотации @Deprecated есть
свойства forRemoval и since.
Улучшение аннотации
Deprecated
22. Новый HTTP API с поддержкой HTTP/2 веб-сокетов. Замена
устаревшему API HTTPURLConnection. Ещё не завершён, доступен в
специальном модуле, который по умолчанию недоступен. Пример:
создание HTTP-запроса и асинхронное получение ответа:
URI testPageURI = new URI("http://127.0.0.1:8080/testPage");
CompletableFuture<HttpResponse> nonBlockingResponse = HttpRequest
.create(testPageURI)
.GET().responseAsync();
int tries = 0;
while (!nonBlockingResponse.isDone() && tries++ < 5)
{ Thread.sleep(5); }
if (nonBlockingResponse.isDone()) {
HttpResponse response = nonBlockingResponse.get();
System.out.println("status code : " + response.statusCode()
+ " --> " + response.body(HttpResponse.asString()));
} else {
nonBlockingResponse.cancel(true);
System.out.println("Cancelling, could not get response");
}
Клиент HTTP 2
23. Desktop приложения Java выделялись своей топорностью.
Максимум - можно управлять размером окна. Для JavaFX даже
иконку приложения нельзя указать! У современных систем: иконки
в трее, панели, перетаскивание, какие-то свои меню и прочее.
Класс java.awt.Desktop раздвигает границы возможностей.
Например, можно реагировать на блокировку экрана,
переключение пользователей, завершение работы системы.
Улучшена работа с панелью задач, иконками, панелями, и т.д.
Например, мигание иконки, если надо привлечь внимание, или
подпрыгивание иконки в докере, или своё меню, индикатор
завершения.
Естественно, все эти радости сильно зависят от системы. В
данный момент, лучше всего дела обстоят с OS X и Windows.
Нативная интеграция
с рабочим столом
24. ●
Applet API устарел
●
Плагин Java для браузера умер
●
javac больше не поддерживает исходный код
Java 1.4 и старше.
Прощание с усопшими
25. ●
Больше нельзя называть переменные символом
подчёркивания. Он зарезервирован.
●
Методы в Optional, такие как конвертер в Stream и or
●
Аннотация SafeVarrargs для приватных методов
●
Поддержка TIFF, экранов высокого разрешения,
улучшения в Java 2D
●
Сжатые строки
●
UTF-8 в файлах свойств
●
Нескольких версий в одном JAR файле
●
Улучшена поддержка ECMAScript 6.
●
Ограничения памяти для контейнеров, таких как Docker
●
Unicode 8.0
Другие изменения, дополнения
26. ●
Унифицированное логирование в JVM
●
Stack-Walking API – работа со stack traces.
●
Поиск по документации Java
●
Генерация JavaDoc в формате HTML 5
Документация и логирование
27. ●
JSON API
●
Вывод типов локальных переменных (var)
Возможно, мы их увидим в Java 10
В Java 9 не вошли