Разделы презентаций


Java SE 9

Содержание

О чёмЧасть нововведений Java SE 9Приватные методы в интерфейсаJShellУлучшенный try-with-resources API Реактивного программированияDiamond оператор для анонимных классовРазноеJava Platform Module System – JPMSПолный список openjdk.java.net/projects/jdk9/

Слайды и текст этой презентации

Слайд 1Java SE 9
Царёв Александр
AATsarev.SBT@sberbank.ru

Java SE 9Царёв АлександрAATsarev.SBT@sberbank.ru

Слайд 2О чём
Часть нововведений Java SE 9
Приватные методы в интерфейса
JShell
Улучшенный try-with-resources


API Реактивного программирования
Diamond оператор для анонимных классов
Разное
Java Platform Module System

– JPMS
Полный список openjdk.java.net/projects/jdk9/
О чёмЧасть нововведений Java SE 9Приватные методы в интерфейсаJShellУлучшенный try-with-resources API Реактивного программированияDiamond оператор для анонимных классовРазноеJava

Слайд 3Это Interface или … ?
Java 7 и ранее – простое

описание контракта
public interface DBLogging{ String MONGO_DB_NAME = "ABC_Mongo_Datastore";

String NEO4J_DB_NAME = "ABC_Neo4J_Datastore"; String CASSANDRA_DB_NAME = "ABC_Cassandra_Datastore"; void logInfo(String message); void logWarn(String message); }
Это Interface или … ?Java 7 и ранее – простое описание контрактаpublic interface DBLogging{   String

Слайд 4Это Interface или … ?
Java 8 – default и static

методы (публичные)
public interface DBLogging{ String MONGO_DB_NAME = "ABC_Mongo_Datastore";

String NEO4J_DB_NAME = "ABC_Neo4J_Datastore"; String CASSANDRA_DB_NAME = "ABC_Cassandra_Datastore"; default void logInfo(String message){ // Step1: Connect to DataStore // Setp2: Log Info Message // Setp3: Close the DataStore connection } default void logWarn(String message){ // Step1: Connect to DataStore // Setp2: Log Warn Message // Setp3: Close the DataStore connection } public static String format(String format, String message) { return String.format(format, message); } // Any other abstract methods }
Это Interface или … ?Java 8 – default и static методы (публичные)public interface DBLogging{   String

Слайд 5Это Interface или … ?
Java 9 – private методы
public interface

DBLogging{ String MONGO_DB_NAME = "ABC_Mongo_Datastore"; String NEO4J_DB_NAME =

"ABC_Neo4J_Datastore"; String CASSANDRA_DB_NAME = "ABC_Cassandra_Datastore"; default void logInfo(String message){ log(message, "INFO") } default void logWarn(String message){ log(message, "WARN") } private void log(String message, String msgPrefix){ // Step1: Connect to DataStore // Setp2: Log Message with Prefix and styles etc. // Setp3: Close the DataStore connection }
public static String format(String format, String message) { return String.format(format, message); } // Any other abstract methods }
Это Interface или … ?Java 9 – private методы	public interface DBLogging{   String MONGO_DB_NAME =

Слайд 6JShell
REPL – read-eval-print loop
Используется для тестирования и использования в консоли

разных конструкций, классов, интерфейсов, перечислений, объектов, операторов и т.д.

JShellREPL – read-eval-print loopИспользуется для тестирования и использования в консоли разных конструкций, классов, интерфейсов, перечислений, объектов, операторов

Слайд 7JShell
import jdk.jshell.JShell; import jdk.jshell.SnippetEvent; import java.util.List; public class JShellTest { public static

void main(String[] args) { JShell.Builder builder =

JShell.builder(); JShell build = builder.build();
List eval = build.eval("System.out.println(\"1 + 1 = \" + (1 + 1));"); eval.forEach(event -> System.out.println(event.value()));
eval = build.eval(“System.exit(-123);");
eval.forEach(event -> System.out.println(event.value())); } }

Output:

1 + 1 = 2
null
Process finished with exit code 0


Слайд 8try-with-resources
Добавлен синтаксический сахар
static void java7() throws IOException { BufferedReader

reader1 = new BufferedReader(new FileReader("1.txt")); try (BufferedReader reader2 =

reader1) { System.out.println(reader2.readLine()); } }

static void java9() throws IOException { BufferedReader reader1 = new BufferedReader(new FileReader("1.txt")); try (reader1) { System.out.println(reader1.readLine()); } }

try-with-resourcesДобавлен синтаксический сахарstatic void java7() throws IOException {   BufferedReader reader1 = new BufferedReader(new FileReader(

Слайд 9try-with-resources
static void java7() throws IOException { BufferedReader reader1 =

new BufferedReader(new FileReader("1.txt")); BufferedReader reader2 = reader1; Throwable

var2 = null; try { System.out.println(reader2.readLine()); } catch (Throwable var7) { var2 = var7; throw var7; } finally { if(reader1 != null) { $closeResource(var2, reader1); } } }

static void java9() throws IOException { BufferedReader reader1 = new BufferedReader(new FileReader("1.txt")); Throwable var2 = null; try { System.out.println(reader1.readLine()); } catch (Throwable var7) { var2 = var7; throw var7; } finally { if(reader1 != null) { $closeResource(var2, reader1); } } }

try-with-resourcesstatic void java7() throws IOException {   BufferedReader reader1 = new BufferedReader(new FileReader(

Слайд 10Реактивное программирование
В Scala, 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.

Реализация:
java.util.concurrent.SubmissionPublisher – базовая реализация
Реактивное программированиеВ Scala, Akka уже были интегрированы reactive streams. Oracle решила добавить Reactive Streams API в Java

Слайд 11Diamond для анонимных классов
Предположим, что у нас есть класс Box

и мы хотим сделать его анонимным.
Вот как это выглядит

в Java 8:

Разве не очевидно, что Box должен быть типа T? Проблема в не обозначаемых (англ. non-denotable) типах, которые распознаются компилятором, а JVM — нет. (Такой случай может быть обработан компилятором, но вопрос — как корректно передать его JVM.)

Box createBox(T content) { // Нужно поставить 'T' здесь :( return new Box(content) { }; }

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>(innerList) { }; }

Проблему исправили в Java 9:

Diamond для анонимных классовПредположим, что у нас есть класс Box и мы хотим сделать его анонимным. Вот

Слайд 12Разное
Immutable коллекции в JDK
API для изображений с разными разрешениями (MultiResolutionImage.java)
JEP

238: Multi-Release JAR Files
JEP 264: Platform Logging API and Service
JEP

277: Enhanced Deprecation
JEP 290: Filter Incoming Serialization Data
JEP 295: Ahead-of-Time Compilation

РазноеImmutable коллекции в JDKAPI для изображений с разными разрешениями (MultiResolutionImage.java)JEP 238: Multi-Release JAR FilesJEP 264: Platform Logging

Слайд 13Java Platform Module System

Java Platform Module System

Слайд 14Project Jigsaw
http://openjdk.java.net/projects/jigsaw/
Сделать Java SE Platform и JDK легче масштабируемой

для мобильных устройств
Улучшить безопасность и способность к поддержке платформы и

JDK

Сделать реализацию и поддержку библиотек и больших приложений на Java SE и EE проще

Project Jigsawhttp://openjdk.java.net/projects/jigsaw/ Сделать Java SE Platform и JDK легче масштабируемой для мобильных устройствУлучшить безопасность и способность к

Слайд 15Мотивация
JEP 200: The Modular JDK
JEP 201: Modular Source Code
JEP 220:

Modular Run-Time Images
JEP 260: Encapsulate Most Internal APIs
JEP 261: Module

System
JEP 282: jlink: The Java Linker

Зачем? Что было раньше плохо?

МотивацияJEP 200: The Modular JDKJEP 201: Modular Source CodeJEP 220: Modular Run-Time ImagesJEP 260: Encapsulate Most Internal

Слайд 16Логическое объединение пакетов, с дополнительной инкапсуляцией
Целевое расширение jmod
В основном, модуль

– это почти то же самое что JAR файл, собранный

из скомпилированных java файлов.
Отличается наличием файла, описывающего модуль module-info.java. Он определяет:
уникальное имя описываемого модуля
от каких модулей зависит описываемый модуль
какие пакеты экспортируются для других модулей

Модуль

Логическое объединение пакетов, с дополнительной инкапсуляциейЦелевое расширение jmodВ основном, модуль – это почти то же самое что

Слайд 17Также называются «Именованные прикладные модули». Это то, что пишут программисты.


Обратная совместимость и миграция:
Автоматические модули – любой JAR, помещённый в

module-path без дескриптора модуля считается автоматическим модулем, позволяя проекту использовать библиотеки ранних версий.
Безымянный (Unnamed) модуль – однако class-path ещё существует... Все JAR файлы (модульные или нет) и классы в class-path’е будут содержаться в нём.

Чтобы использовать правильно «всю модульность» нужно, чтобы все зависимости были модулями…

Модуль приложения

Также называются «Именованные прикладные модули». Это то, что пишут программисты. Обратная совместимость и миграция:Автоматические модули – любой

Слайд 18«Читабельность» модуля
Обеспечение надежности конфигурации:
граф модулей должен быть ацикличным;
модуль читает

не более одного модуля, с конкретный пакетом;
модули, определяющие одинаковые пакеты,

не перекрывают друг друга.
«Читабельность» модуляОбеспечение надежности конфигурации: граф модулей должен быть ацикличным;модуль читает не более одного модуля, с конкретный пакетом;модули,

Слайд 19Platform

Platform

Слайд 21Module-path как замена Classpath
Module-path содержит артефакты модулей.
Переменная module-path содержит скомпилированные

определения библиотеки и модулей приложений (все фазы жизненного цикла).
В

classpath артефакты могут:
содержать типы в одинаковых пакетах, даже если это разные версии одного типа.
теряться от момента компиляции до run-time’а
Module-path как замена ClasspathModule-path содержит артефакты модулей.Переменная module-path содержит скомпилированные определения библиотеки и модулей приложений (все фазы

Слайд 22Простейшее описание модуля с экспортируемым пакетом:
Вложенные пакеты в com.sbt.jre.service нужно

экспортировать явно!
Если нужно экспортировать пакет конкретному стороннему модулю, то используется

ограниченный экспорт: my.package to another.module
Описание зависимостей:

Часть requires ссылается только на имена пакетов.
Для транзитивного экспорта пакета com.sbt.jre.service через модуль com.sbt.jre другим модулям нужно использовать requires transitive

module com.sbt.jre.service { exports com.sbt.jre.service; }

module com.sbt.jre { requires com.sbt.jre.service; }

module-info.java

Простейшее описание модуля с экспортируемым пакетом:Вложенные пакеты в com.sbt.jre.service нужно экспортировать явно!Если нужно экспортировать пакет конкретному стороннему

Слайд 23Чтобы обеспечить низкую связность модулей, в модульную систему зашито использование

сервисов.
Пусть модуль com.sbt.jre ничего не знает о реализации, но хочет

использовать сервис com.sbt.jre.service.EventService:

Реализация сервиса поставляется отдельным модулем:

module com.sbt.jre { requires com.sbt.jre.service; uses com.sbt.jre.service.EventService; }

module com.sbt.jre.talk.service { requires com.sbt.jre.service; exports com.sbt.jre.talk.service; provides com.sbt.jre.service.EventService with com.sbt.jre.talk.service.TalkService; }

Сервисы

Чтобы обеспечить низкую связность модулей, в модульную систему зашито использование сервисов.Пусть модуль com.sbt.jre ничего не знает о

Слайд 24Использование в клиентском коде:
Возвращает перечисление Iterable, в котором для данного

сервиса содержатся все реализации, предлагаемые модулями из module-path и описанные

в блоке provides ... with ...

ServiceLoader.load(EventService.class)

Сервисы

Использование в клиентском коде:Возвращает перечисление Iterable, в котором для данного сервиса содержатся все реализации, предлагаемые модулями из

Слайд 25module jdk.jshell { requires transitive java.compiler; requires jdk.compiler;

requires transitive java.prefs; requires jdk.internal.ed; requires java.logging;

requires transitive jdk.jdi; requires jdk.internal.opt; requires jdk.internal.le; exports jdk.jshell.spi; exports jdk.jshell.tool; exports jdk.jshell; exports jdk.jshell.execution; uses jdk.internal.editor.spi.BuildInEditorProvider; uses jdk.jshell.spi.ExecutionControlProvider; provides javax.tools.Tool with jdk.internal.jshell.tool.JShellToolProvider; provides jdk.jshell.spi.ExecutionControlProvider
with jdk.jshell.execution.JdiExecutionControlProvider, jdk.jshell.execution.LocalExecutionControlProvider, jdk.jshell.execution.FailOverExecutionControlProvider; }

Пример модуля jdk.jshell

module jdk.jshell {   requires transitive java.compiler;   requires jdk.compiler;   requires transitive java.prefs;

Слайд 26Всё познаётся в сравнении…

Всё познаётся в сравнении…

Слайд 27А как на счёт…
Module Hell?
Есть ли динамическая загрузка зависимостей?
Версионирование зависимостей?
Деплой

на мобильные устройства легче?
Что с classloader’ами?
reflection — теперь нельзя то,

что очень хочется?
А как на счёт…Module Hell?Есть ли динамическая загрузка зависимостей?Версионирование зависимостей?Деплой на мобильные устройства легче?Что с classloader’ами?reflection —

Слайд 28Список источников
http://openjdk.java.net/projects/jdk9/
http://openjdk.java.net/projects/jigsaw/
http://www.journaldev.com/13121/java-9-features-with-examples
https://developer.jboss.org/blogs/scott.stark/2017/04/14/critical-deficiencies-in-jigsawjsr-376-java-platform-module-system-ec-member-concerns?_sscc=t
https://developer.atlassian.com/blog/2015/08/optional-broken/
https://dzone.com/articles/whats-wrong-java-8-part-iv
https://labs.consol.de/development/2017/02/13/getting-started-with-java9-modules.html
https://blog.codefx.org/java/dev/will-there-be-module-hell/
http://shop.oreilly.com/product/9781787282841.do
http://www.apress.com/la/book/9781484225912

Список источниковhttp://openjdk.java.net/projects/jdk9/ http://openjdk.java.net/projects/jigsaw/http://www.journaldev.com/13121/java-9-features-with-examples https://developer.jboss.org/blogs/scott.stark/2017/04/14/critical-deficiencies-in-jigsawjsr-376-java-platform-module-system-ec-member-concerns?_sscc=t https://developer.atlassian.com/blog/2015/08/optional-broken/ https://dzone.com/articles/whats-wrong-java-8-part-iv https://labs.consol.de/development/2017/02/13/getting-started-with-java9-modules.html https://blog.codefx.org/java/dev/will-there-be-module-hell/ http://shop.oreilly.com/product/9781787282841.do http://www.apress.com/la/book/9781484225912

Слайд 29Спасибо за внимание!

Спасибо за внимание!

Слайд 30Нужен способ миграции приложений, даже если они зависят от библиотек,

которые еще не были опубликованы как модули.
Автоматические модули: любой

JAR, помещённый в module-path без дескриптора модуля считается автоматическим модулем, позволяя вашему проекту Java 9 использовать библиотеки ранних версий.
Автоматические модули неявно экспортируют все свои пакеты и имеют доступ ко всем остальным модулям. Поскольку автоматический модуль не объявляет явно имя, оно генерируется в зависимости от имени JAR файла. В основном, он удалит расширение файла и номер завершающей версии (если есть) и заменит все небуквенные символы точками, например: mongo-java-driver-3.3.0.jar будет выглядеть как модуль с именем mongo.java.driver (точный алгоритм описан в документации ModuleFinder.
Каждый модуль, который требует mongo.java.driver, имеет доступ ко всем его пакетам. Автоматические модули, в свою очередь, могут обращаться ко всем другим модулям, в том числе к безымянному модулю.

Приложение. Автоматические модули

Нужен способ миграции приложений, даже если они зависят от библиотек, которые еще не были опубликованы как модули.

Слайд 31Однако class-path ещё существует... Все JAR файлы (модульные или нет)

и классы в class-path’е будут содержаться в безымянном модуле.
Подобно

автоматическим модулям, он экспортирует все пакеты и читает все остальные модули.
Не имеет имени. По этой причине на него не могут ссылаться именованные модули приложения.
Безымянный модуль может получить доступ ко всем другим модулям.
Он один на JVM

Приложение. Безымянный (Unnamed) модуль

Однако class-path ещё существует... Все JAR файлы (модульные или нет) и классы в class-path’е будут содержаться в

Слайд 32И последнее, но не менее важное: сама JDK была перенесена

в модульную структуру. Вся основная функциональность Java будет предоставляться различными

модулями, например java.xml, java.logging или java.httpclient.

Именование модулей: префиксы java.* vs jdk.*
Не считая javafx.*, oracle.*

Модуль java.base
Корневой и обязательный модуль
Самый базовый API предоставляется java.base, любой модуль зависит от него неявно.
Включает java.lang.module – работа с модульной системой

Приложение. Платформенные модули

И последнее, но не менее важное: сама JDK была перенесена в модульную структуру. Вся основная функциональность Java

Слайд 33Приложение. Platform «изнутри»

Приложение. Platform «изнутри»

Слайд 34Приложение. JDK «изнутри»

Приложение. JDK «изнутри»

Слайд 35Имя модуля – так же как именуются пакеты – обратное

имя домена, например: com.sbt.jre
Имя каталога, содержащего модуль, должно быть равно

имени модуля. Например для сервиса com.sbt.jre.service:

Технически, имя модуля не зависит от имён, располагаемых в нём пакетов.

src +- main +- com.sbt.jre.service +- module-info.java +- com +- sbt +- jre +- service +- EventService.java

Приложение. Именование модуля

Имя модуля – так же как именуются пакеты – обратное имя домена, например: com.sbt.jreИмя каталога, содержащего модуль,

Слайд 36Existing systems rely on identifying the current application by using

the Thread Context Class Loader (TCCL).  Because modules in Jigsaw

are not represented by class loaders, programs which rely on this behavior of the TCCL will begin to exhibit subtly incorrect behavior.No corresponding concept exists for modules, which means that any software relying on this concept must be redesigned and re-implemented to use some different approach.

Приложение. No "Current Module"

Existing systems rely on identifying the current application by using the Thread Context Class Loader (TCCL).  Because

Слайд 37Reactive stream test
import java.util.concurrent.Executors; import java.util.concurrent.Flow; import java.util.concurrent.SubmissionPublisher; public class ReactiveStreamTest {

public static void main(String[] args) { SubmissionPublisher

publisher = new SubmissionPublisher(Executors.newFixedThreadPool(3), 5); publisher.subscribe(new Flow.Subscriber() { @Override public void onSubscribe(Flow.Subscription subscription) { subscription.request(Long.MAX_VALUE); System.out.println("Subscriber#onSubscribe: " + subscription); } @Override public void onNext(Object item) { System.out.println("Subscriber#onNext: " + item); } @Override public void onError(Throwable throwable) { System.out.println("Subscriber#onError: " + throwable); } @Override public void onComplete() { System.out.println("Subscriber#onComplete: DONE!"); } }); for (int i = 0; i < 5; i++) { System.out.println("Published " + i); publisher.submit(i); } } }
Reactive stream testimport java.util.concurrent.Executors; import java.util.concurrent.Flow; import java.util.concurrent.SubmissionPublisher;  public class ReactiveStreamTest {    public

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика