Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Java 9
Ставила Леонид
март, 2017
кратко о новомкратко о новом
●
Модульная система - проект Jigsaw
●
Интерпретатор Jshell
●
Ahead-of-Time компиляция
●
Реактивные стримы
●
Усовершенствования Process API
●
Images API - картинки с несколькими размерами
●
Фабричные методы коллекций
●
Клиент HTTP 2
●
Тесная интеграция с рабочим столом
●
И многое другое
Java 9: июль 2017
●
Самое важное новшество в Java 9
●
Планировалась ещё в Java 7
●
Реализация длилась около 10 лет
●
Все библиотеки сгруппированы в модули
●
Используются только необходимые
●
Ещё один уровень инкапсуляции — публичные
классы видны, если это разрешено в модуле
Модульная система
проект Jigsaw
Разработчики Java постарались на славу,
максимально отвязав классы от сторонних
зависимостей:
●
Все модули: 137 Мб
●
JavaFX: 30 Мб
●
XML: 10 Мб
●
java.base: 19 Мб
Jigsaw: цифры
●
Некоторые библиотеки, например com.sun.* не
будут доступны по умолчанию.
●
Введение модульности повлечёт за собой
внесение изменений в предыдущий код.
●
Усложнена система видимостей - теперь помимо
классов и пакетов есть ещё и модули.
Неудобства,
недостатки
Консоль, в которой можно объявлять
переменные, писать выражения, выполнять
команды и тут же получать результат.
●
Дружелюбный для начинающих
●
Удобный для разработчиков
●
Автоматическое дополнение по клавише tab
●
Сохранение/загрузка команд
●
Не нужно ставить «;»
JShell – интерпретатор Java 9
Было: для проверки фрагмента кода создавался
класс с методом main, или тестовый класс.
●
Для начинающих это шок - много непонятного
кода чтобы вывести на экран "Hello World!".
●
Если громоздкое приложение - Spring, Hibernate,
в добавок, код на JS - проверять кусочек кода
очень дорого, подчас, минута-две и более
ожидания, пока всё поднимется.
JShell
●
Компиляция непосредственно в машинный код
●
Исполняемому файлу не нужны JRE, JDK
●
Скорость выполнения близка к Си
●
Невозможность декомпиляции
Ahead-of-Time компиляция
Сравнение
с приложением на Си
Утилита jaotc очень тщательно анализирует
исходники (что невозможно при JIT компиляции) и
переводит их в машинный код.
Даже при AoT программа, написанная на Java
будет работать хоть немножко, на какие-то доли
процента, но медленнее чем аналогичная
программа на Си. Причина - безопасность типов,
проверки массивов на переполнение и прочие
вещи, которые в Си могут запросто завалить не
только работающее приложение, но и всю
систему.
Сейчас гарантируется только покрытие модуля
java.base, то есть, объектов, потоков и структур
данных. И то, только для 64-битных систем Linux.
Вопрос создания таким образом даже оконного
приложения под большим вопросом.
Решение идеально для встраиваемых и
мобильных систем, поскольку, динамическая
компиляция потребляет ресурсы процессора и
аккумулятора. В iOS запрещена динамическая
загрузка кода, на Java было невозможно писать
программы под телефоны от Apple.
Асинхронная обработка потоков данных.
Интерфейсы java.util.concurrent.Flow:
Flow.Processor<T,R>
Flow.Publisher<T>
Flow.Subscriber<T>
Flow.Subscription
Издатель производит данные, потребляемые
несколькими подписчиками. Подписки
связывают издателей и подписчиков.
Перспектива использования в распределённых
приложениях очень реальная.
Reactive Streams API
Publish Subscribe Framework
Информацию о процессе доступна с помощью
java.lang.ProcessHandle:
●
pid
●
вся информация
●
команда запуска
●
время запуска
●
суммарное процессорное время
●
имя пользователя
Так же можно уничтожать процессы. Имеется
возможность повесить событие, которое будет
происходить после завершения процесса:
ProcessHandle.onExit().
Process API
Интерфейс
java.awt.image.MultiResolutionImage хранит
картинки с несколькими размерами. Возвращает
весь список картинок, или, зная габариты,
подбирает наиболее подходящую.
Применение: поддержка графики на различных
мониторах. В зависимости от разрешения
экрана и размера окна класс
java.awt.Graphics будет получать нужный
вариант картинки.
Картинки с несколькими
размерами в Images API
Java 8: неизменяемые коллекции:
Map<String, String> immutableMap =
Collections.unmodifiableMap(
new HashMap<String, String>() {{
put("key1", "Value1");
put("key2", "Value2");
put("key3", "Value3");
}});
Java 9:
List<String> immutableList = List.of("one", "two");
Set<String> iSet = Set.of("value1", "value2");
Map<String, String> iMap =
Map.of("key1", "Value1", "key2", "Value2");
Фабричные методы коллекций
Доработка интерфейсов была начата ещё в
Java 8. Были добавлены статические
методы и методы по умолчанию. Теперь
есть ещё и приватные методы.
Повышают чистоту и ясность кода.
Статические приватные классы доступны
только в пределах интерфейса, обычные
же можно вызывать из экземпляра
интерфейса.
Private методы в интерфейсах
Команда 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-с-ресурсами
В 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-с-ресурсами
Diamond operator упрощает запись
параметризованных данных.
List<String> preJava7 = new ArrayList<String>();
List<String> java7 = new ArrayList<>();
Повышается читабельность кода, но такая запись
не работала с анонимными классами. Теперь и
это в прошлом:
List<String> list = new ArrayList<>(){ ... };
Улучшения для алмазного
оператора
Аннотация @Deprecated используется для
пометок в Java API устаревшего или
неверно работающего кода.
Теперь у аннотации @Deprecated есть
свойства forRemoval и since.
Улучшение аннотации
Deprecated
Новый 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
Desktop приложения Java выделялись своей топорностью.
Максимум - можно управлять размером окна. Для JavaFX даже
иконку приложения нельзя указать! У современных систем: иконки
в трее, панели, перетаскивание, какие-то свои меню и прочее.
Класс java.awt.Desktop раздвигает границы возможностей.
Например, можно реагировать на блокировку экрана,
переключение пользователей, завершение работы системы.
Улучшена работа с панелью задач, иконками, панелями, и т.д.
Например, мигание иконки, если надо привлечь внимание, или
подпрыгивание иконки в докере, или своё меню, индикатор
завершения.
Естественно, все эти радости сильно зависят от системы. В
данный момент, лучше всего дела обстоят с OS X и Windows.
Нативная интеграция
с рабочим столом
●
Applet API устарел
●
Плагин Java для браузера умер
●
javac больше не поддерживает исходный код
Java 1.4 и старше.
Прощание с усопшими
●
Больше нельзя называть переменные символом
подчёркивания. Он зарезервирован.
●
Методы в Optional, такие как конвертер в Stream и or
●
Аннотация SafeVarrargs для приватных методов
●
Поддержка TIFF, экранов высокого разрешения,
улучшения в Java 2D
●
Сжатые строки
●
UTF-8 в файлах свойств
●
Нескольких версий в одном JAR файле
●
Улучшена поддержка ECMAScript 6.
●
Ограничения памяти для контейнеров, таких как Docker
●
Unicode 8.0
Другие изменения, дополнения
●
Унифицированное логирование в JVM
●
Stack-Walking API – работа со stack traces.
●
Поиск по документации Java
●
Генерация JavaDoc в формате HTML 5
Документация и логирование
●
JSON API
●
Вывод типов локальных переменных (var)
Возможно, мы их увидим в Java 10
В Java 9 не вошли
http://programtalk.com/java/java-9-new-features/
http://openjdk.java.net/projects/jigsaw/quick-start
http://download.java.net/java/jdk9/docs/api/overview-su
https://habrahabr.ru/company/piter/blog/271941/
https://habrahabr.ru/company/piter/blog/272861/
https://tproger.ru/news/jaotc-wtf/
Ссылки, источники

More Related Content

Java 9 - кратко о новом

  • 1. Java 9 Ставила Леонид март, 2017 кратко о новомкратко о новом
  • 2. ● Модульная система - проект Jigsaw ● Интерпретатор Jshell ● Ahead-of-Time компиляция ● Реактивные стримы ● Усовершенствования Process API ● Images API - картинки с несколькими размерами ● Фабричные методы коллекций ● Клиент HTTP 2 ● Тесная интеграция с рабочим столом ● И многое другое Java 9: июль 2017
  • 3. ● Самое важное новшество в Java 9 ● Планировалась ещё в Java 7 ● Реализация длилась около 10 лет ● Все библиотеки сгруппированы в модули ● Используются только необходимые ● Ещё один уровень инкапсуляции — публичные классы видны, если это разрешено в модуле Модульная система проект Jigsaw
  • 4. Разработчики Java постарались на славу, максимально отвязав классы от сторонних зависимостей:
  • 5. ● Все модули: 137 Мб ● JavaFX: 30 Мб ● XML: 10 Мб ● java.base: 19 Мб 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
  • 16. Java 8: неизменяемые коллекции: Map<String, String> immutableMap = Collections.unmodifiableMap( new HashMap<String, String>() {{ put("key1", "Value1"); put("key2", "Value2"); put("key3", "Value3"); }}); Java 9: List<String> immutableList = List.of("one", "two"); Set<String> iSet = Set.of("value1", "value2"); Map<String, String> iMap = Map.of("key1", "Value1", "key2", "Value2"); Фабричные методы коллекций
  • 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 не вошли