Java SE 9 презентация

Содержание

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

Слайд 1Java 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/

Слайд 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); }


Слайд 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 }


Слайд 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 }

Слайд 6JShell
REPL – 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()); } }


Слайд 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); } } }


Слайд 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 – базовая реализация

Слайд 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:


Слайд 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


Слайд 13Java Platform Module System


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

мобильных устройств

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

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


Слайд 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

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


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

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

Модуль


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

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

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

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


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

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

Слайд 19Platform


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

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

В classpath артефакты могут:
содержать типы в одинаковых пакетах, даже если это разные версии одного типа.
теряться от момента компиляции до run-time’а


Слайд 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


Слайд 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; }

Сервисы


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

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

ServiceLoader.load(EventService.class)

Сервисы


Слайд 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


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


Слайд 27А как на счёт…
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


Слайд 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) модуль


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

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

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

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

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


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


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


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

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

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

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

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


Слайд 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"


Слайд 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); } } }

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

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

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

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

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


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

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