Что нового в java 6. Private методы в интерфейсах. Ввод-вывод и работа с сетью

Nokia 02.04.2019

Ожидается, что новая версия Java 9 выйдет уже 27 июля 2017 года. Давайте разберёмся, какие функции появятся, и расскажем, зачем они нужны.

Вот список важных нововведений Java 9:

С помощью примеров расскажем подробнее об этих функциях.

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 ==> 10 jshell> 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 метод.

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() { // Реализация метода происходит здесь. } }

Модульная система

Одним из самых значительных изменений является появление модульной системы. До Java 9 мы использовали JAR-файлы для разработки приложений, базирующихся на Java. Однако, эта архитектура имеет несколько ограничений и недостатков. Для их устранения и внедрили модульную систему . Это нововведение является частью проекта Jigsaw , который разрабатывается для того, чтобы программисты могли разбивать программы на независимые и межпрограммные модули.

Вот некоторые из функций этой системы:

  • модульная 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>(innerList) { }; } }

Дополнительные улучшения в классах

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 - просто интерфейс-маркер. Многие разработчики . Их услышали и добавили возможности работы с устаревшими API. Например, появились инструменты для их анализа - forRemoval и since .

HTTP/2 клиент

Oracle планирует выкатить новый HTTP-клиент для поддержки протоколов HTTP/2 и WebSocket. Они заменяют HttpURLConnection API на новый, более производительный.
Новый API будет представлен в пакете «java.net.http». Он поддерживает как синхронный, так и асинхронный режимы.

Новый API можно посмотреть

10 ответов

Класс java.util.Date на самом деле не устарел, просто этот конструктор, а также пара других конструкторов/методов устарели. Это было устарело, потому что такое использование не очень хорошо работает с интернационализацией. Вместо этого следует использовать класс Calendar:

Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 1988); cal.set(Calendar.MONTH, Calendar.JANUARY); cal.set(Calendar.DAY_OF_MONTH, 1); Date dateRepresentation = cal.getTime();

Классы java.util.Date , java.util.Calendar и java.text.SimpleDateFormat были слишком быстры, когда Java впервые запустила и развилась. Классы не были хорошо разработаны или реализованы. Усовершенствования были предприняты, таким образом, были обнаружены отклонения. К сожалению, попытки улучшения в значительной степени потерпели неудачу. Вы должны избегать этих классов вообще. Они вытесняются в Java 8 новыми классами.

Проблемы в коде

В java.util.Date есть и дата, и временная часть. Вы игнорировали часть времени в своем коде. Таким образом, класс Date займет начало дня, как определено вашим часовым поясом по умолчанию JVM, и примените это время к объекту Date. Таким образом, результаты вашего кода будут варьироваться в зависимости от того, какой компьютер он запускает или какой часовой пояс установлен. Наверное, не то, что вы хотите.

Если вам нужна только дата, без временной части, например, для даты рождения, вы можете не захотеть использовать объект Date . Вы можете сохранить только строку даты, в ISO 8601 формат YYYY-MM-DD . Или используйте объект LocalDate из Joda-Time (см. Ниже).

Joda времени

Первое, что нужно узнать на Java: Избегайте печально известных проблемных классов java.util.Date и java.util.Calendar в комплекте с Java.

Пример кода в Joda-Time 2.3

DateTimeZone timeZoneNorway = DateTimeZone.forID("Europe/Oslo"); DateTime birthDateTime_InNorway = new DateTime(1985, 1, 1, 3, 2, 1, timeZoneNorway); DateTimeZone timeZoneNewYork = DateTimeZone.forID("America/New_York"); DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime(timeZoneNewYork); DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime(DateTimeZone.UTC); LocalDate birthDate = new LocalDate(1985, 1, 1);

Дамп для консоли...

System.out.println("birthDateTime_InNorway: " + birthDateTime_InNorway); System.out.println("birthDateTime_InNewYork: " + birthDateTime_InNewYork); System.out.println("birthDateTime_UtcGmt: " + birthDateTime_UtcGmt); System.out.println("birthDate: " + birthDate);

При запуске...

BirthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00 birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00 birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z birthDate: 1985-01-01

java.time

Где получить классы java.time?

Я столкнулся с этим вопросом как дубликат нового вопроса , в котором спрашивали, что не устаревший способ получить Date в конкретный год, месяц, и день был.

В ответах здесь показывается использование класса Calendar , и это было верно до тех пор, пока не выйдет Java 8. Но с Java 8 стандартный способ сделать это:

LocalDate localDate = LocalDate.of(1985, 1, 1);

И если вам действительно нужен java.util.Date , вы можете использовать предложения в этом вопросе .

Для получения дополнительной информации ознакомьтесь с API или учебники для Java 8.

Обратите внимание, что Calendar.getTime() является недетерминированным в том смысле, что часть дня по умолчанию соответствует текущему времени.

Чтобы воспроизвести, попробуйте выполнить следующий код пару раз:

Calendar c = Calendar.getInstance(); c.set(2010, 2, 7); // NB: 2 means March, not February! System.err.println(c.getTime());

Вывод, например:

Sun Mar 07 10:46:21 CET 2010

Запуск одного и того же кода через пару минут дает:

Sun Mar 07 10:57:51 CET 2010

Итак, в то время как set() заставляет соответствующие поля корректировать значения, он течет системное время для других полей. (Протестировано выше с помощью Sun jdk6 и jdk7)

Одна из причин, по которой конструктор устарела, заключается в том, что значение параметра year не является тем, что вы ожидаете. В javadoc говорится:

Начиная с версии JDK версии 1.1, заменяется на Calendar.set(year + 1900, month, date) .

Обратите внимание, что поле year - это количество лет с 1900 , поэтому ваш пример кода скорее всего не будет делать то, что вы ожидаете от него. И это точка.

У экземпляра класса Date есть состояние, а именно конкретный момент времени. Хотя вам не нужно знать это, когда вы используете класс Date, время представлено числом миллисекунд (положительным или отрицательным) с фиксированной точки, так называемой эпохой, которая равна 00:00:00 UTC, 1 января, 1970.

Класс Date не очень полезен для управления датами. Дизайнеры библиотеки Java считают, что описание даты, такое как "31 декабря 1999 года, 23:59:59", является произвольным соглашением, которым управляет календарь. Это конкретное описание следует за григорианским календарем, который является календарем, используемым в большинстве стран мира. Тот же момент времени будет описан по-разному в иранских солнечных (шамси), китайских или еврейских лунных календарях, не говоря уже о календаре, используемом вашими клиентами с Марса.

Дизайнеры библиотеки решили разделить проблемы сохранения времени и привязки имен к точкам времени. Поэтому стандартная библиотека Java содержит два отдельных класса: класс Date, который представляет собой момент времени, и класс GregorianCalendar, который выражает даты в знакомой календарной нотации. На самом деле класс GregorianCalendar расширяет более общий класс календаря, который описывает свойства календарей в целом. Стандартная библиотека Java также содержит реалии тайского буддийского и японского императорского календаря.

Разделительное измерение времени из календарей - хороший объектно-ориентированный дизайн. В целом, рекомендуется использовать отдельные классы для выражения разных понятий. Класс Date имеет только небольшое количество методов, которые позволяют вам сравнить два момента времени. Например, методы до и после говорят вам, что один момент времени до или после другого:

If (today.before(birthday)) System.out.println("Still time to shop for a gift.");

Класс GregorianCalendar имеет гораздо больше методов, чем класс Date. В частности, он имеет несколько полезных конструкторов.

Что нового появилось в Java SE 6 ?

Если сравнивать с тем, что изменилось в Java 5.0 по сравнению с Java 1.4, то такого рода изменений не произошло. Совсем. Язык остался таким, каким он был.

А вот если посмотреть на другие аспекты, то тут произошло мнго изменений, которые я постараюсь описать. Вряд ли смогу описать все подробно – думаю, что для этого проще зайти на сайт Sun и почитать –

Данная работа появилась именно в результате чтения всех новинок. А там есть что посмотреть. Я не включил описание всех изменений, указанных в официальной документации потому, что посчитал не все столь важным и нужным. Да и объем такой большой, что заняло бы это у меня много времени. Задача данной статьи просто коснуться того, что изменилось. Если вас заинтересует какая-то область, то идите по ссылкам. Итак, давайте по порядку.

Collection Framework

Здесь появились новые интерфейсы и реализации этих интерфейсов.

Интерфейсы:

Deque – развитие интерфейса Queue. Название расшифровывается как «double ended queue» и произносится как ДЕК. Как вы наверно догадались основная идея в том, чтобы организовать очередь, которая работает с обоих концов – как FIFO (интерфейс Queue) и LIFO (интерфейс Stack)

BlockingDeque – интерфейс позволяет блокировать себя при ожидании поступления в очередь элемента.

NavigableSet , NavigableMap – интерфейсы позволяют искать наиболее близкое значение в наборе.

ConcurrentNavigableMap – тоже, что и NavigableMap , но еще поддерживает рекурсию в подмэпах. Не смотрел более подробно – предоставляю это сделать вам самим.

Реализации (я думаю. что вы сами догадаетесь, какие интерфейсы они реализуют):

ArrayDeque , ConcurrentSkipListSet , ConcurrentSkipListMap , LinckedBlockingDeque

Также надо отметить, что изменились существующие классы, которые теперь реализуют новые интерфейсы.

Это – LinkedList , TreeSet , TreeMap.

Deployment (Java Web Start and Java Plug-in)

В общем основная идея в том, что теперь изменен формат кэширования приложений для Web Start. Также появились некоторые дополнительные фичи при загрузке – система управления кэшем, поддержка параметра “no-cache” в HTTP-запросе.

Есть некоторые изменения по безопасности, среди которых я бы выделил поддержку сертификатов.

Internationalization Support

Наверно самое впечатляющее для меня было то, что окзазывается поддерживается не один Григорианский календарь, а целых три:

— Григорианский календарь (с версии 1.1)

— Буддисткий календарь (с версии 1.4)

— Японский императорский календарь (с версии 1.6)

I / O Support

Изменения затронули два пакета:

Появился новый класс – Console. (http://java.sun.com/javase/6/docs/api/java/io/Console.html)

Он предназначен для взаимодействия с символьно-оринетированным устройством. В описании класса есть неплохой пример для ввода пароля

Console cons; char passwd; if ((cons = System.console()) != null && (passwd = cons.readPassword("[%s]", "Password:")) != null) { ... java.util.Arrays.fill(passwd, " "); }

Console cons ;

char passwd ;

if ((cons = System . console () ) != null && (passwd = cons . readPassword ("[%s]" , "Password:" ) ) != null ) {

. . .

java . util . Arrays . fill (passwd , " " ) ;

Также следует обратить внимание на новые методы в классе File для работы с диском – getTotalSpace (), getFreeSpace (), getUsableSpace (). И для работы с файлом –setWritable (), getReadable (), getExecutable ()

java. nio

Сделана новая имплементация для java. nio. channels. SelectorProvider . Как пишут, он теперь более масштабируем.

И изменен метод lock для класса java. nio. channels. FileChannel . Так что тем, кто их использует надо быть внимательнее.

JAR (Java Archive Files)

Здесь было приятно увидеть следующее. Появилось два класса-потока:

  1. java . util . zip . DeflaterInputStream – чтение сжатых данных из потока
  2. java . util . zip . InflaterOutputStream – запись сжатых данных в поток

Это позволяет передавать по сети сжатые данные, что не может не радовать.

Кроме этого были сделаны дополнения:

Список файлов в архиве теперь не ограничен 64Кб (была такая проблема при больших архивах, где много файлов)

Для Windows сделаны дополнения: имя файла теперь может быть длиннее 256 символов и ограничение на одновременное открытие более 2000 zip -файлов тоже снято. Наверно какое-то ограничение осталось, но видимо оно теперь слишком большое.

Утилита JAR теперь имеет ключик e – он позволяет задать точку входа – аналог аттрибута Main - Class в манифесте.

JMX (Java Management Extensions)

Поначалу я думал. что смогу осилить описание изменений, которые сделаны в данной области, но не думаю, что этот труд будет оценен. В двух словах – введена поддержка generics, улучшены свойства MBeans и исправлено достаточно много багов. Больше не хотелось бы говорить, кому очень надо – идите по ссылке JMX API Enhancements

Хотя думаю, что те, кто заинтересован в такой инфомрации уже там побывали.

JPDA (Java Platform Debugger Architecture)

Для тех, кого этот вопрос мало интересует (а таких думаю как раз большинство) этот раздел вряд ли представляет большой интерес.

JVM TI (Java Virtual Machine Tool Interface)

Тем кто знает, что такое JVM TI могу сообщить только одно – он был улучшен и изменен. Более подробно вряд ли есть смысл описывать. Тем же кто очень хочет узнать. что это такое советую заглянуть вот сюда — JVM™ Tool Interface

JConsole for Java SE 6

Тем кто пользовался могу сообщить, что теперь JConsole является официально поддерживаемой утилитой. Тем кто не знает, что это такое скажу только что это утилита, которая в графическом виде позволяет заниматься мониторингом JVM. Насколько это важно и нужно – решать вам.

Networking Features

Здесь есть что посмотреть.
Во-первых надо обратить внимание на класс java.net.NetworkInterface . Он теперь позволяет получить много информации: о маске подсети, broadcast адрес, MAC-адрес.Во-вторях появился новый класс —java.net.InterfaceAddress . Позволяет получить информацию о сетевом интерфейсе, причем как для IPv4, так и для IPv6.Изменения коснулись также поддержки NTLM, HTTP-аутентификации и работы с куками.

Perfomance

Я не думаю, что надо перечислять все, что там сделано, но с другой стороны не упомянуть об этом было бы не очень разумно. В данном случае придется опять обойтись ссылкой — Java SE 6 Performance White Paper

Единственное, чтобы я выделил – результаты тестов, представленные в данной статье. Впечатлило. Общая производительность вычислений возрасла блее чем на 70%. Операции ввода/вывода – в два раза.

Scripting

Security

Drag and Drop

Кроме того, что этот механизм теперь сделан более удобным для программистов сказать нечего. Равзе что пример спасет ситуацию.

Swing

Здесь я бы выделил несколько моментов (тем более еще есть в памяти конференция)

Вот какие моменты осветили:
1. TrayIcon — в общем радуйтесь — теперь иконка в трее будет там, где это только возможно
2. SpalshScreen — при старте приложения можно вывести картинку на время закгрузки. И если загрузка продолжается уже после старта JVM (вам что-то необходимо добавить, соеденить и прочая) вы можете управлять вашей картинкой. Т.е. что-то рисовать на ней.
3. Обработка текста на LCD. В общем идея следующая — при красивой прорисовке текста на LCD используеся не один цвет, а несколько для улучшения восприятия. Вот это и введено будет в 1.6
4. Улучшена скорость OpenGL и DirectX
5. Т.к. заканчивается срок лицензии на формат GIF будет сделан GIF-Writer с помощью которого можно будет записывать графически файлы
6. Улучшения для деплоя приложения — в общем какие-то изменения для WebStart. Что именно — не упомнить.
7. SWING — тут изменений было несколько, так что буду перечислять подряд
7.1. Look & Feel — теперь они будут использовать сами ОС и ваши приложения будут выглядеть так же как нативные приложения. И если вдруг вы введете новые темы в вашу ОС, то JAVA-риложения подхватят это тоже. Т.е. теперь LF используют данные из ОС, чтобы рисовать компоненты.
7.2. SwingWorker — записал, но к чему это относится — не могу вспомнить. По-моему к тредам про прорисовке. Т.е. что-то там стало лучше.
7.3. LayoutEnhacement — дополнительные возможности для лэйаутов.
7.4. Drag&Drop — теперь это будет очень просто реализовать
7.5. True Double Buffering — при перетаскиваниии окна поверж другого могли возникать пустые прямоугольники. Теперь этого не будет. Вообще прорисовка будет еще быстрее. Посмотрим.
7.6. Text Printing — была такая проблема, что текст мог раюиваться при печати пополам — вержняя часть строки на одной странице, нижняя — на другой. Теперь этой пробелмы не будет, утверждал докладчик.
7.7. JTable теперь будет уметь сортировать и фильтровать
7.8. В табуляторы теперь можно будет помещать любые компоненты. Т.е. теперь закладочки будут делать то, что вы от них захотите. Что достаточно удобно.

Я конечно же осветил не все. Но может быть кому-то данная статья поможет сориентироваться в нововведениях Java SE 6. И тогда буду считать, что писал эту статью не зря. Спасибо.

Java - удивительно универсальный язык программирования. На сегодняшний день насчитывается около 6.5 млн разработчиков Java по всему миру. И все благодаря его утилитарности, простоте использования, безопасности и независимости платформы (он работает вне зависимости от того, какое оборудование или операционная система используются).

Java была разработана в 1995 году компанией Sun Microsystems и изначально создавалась для интерактивного телевидения и программирования бытовых электронных устройств. Тем не менее, публичный релиз Java 1.0 выявил смену фокуса на интернет-использование, превратив его в один из самых популярных языков программирования.

Очевидно, со времен 1.0 многое изменилось и вот наконец после множества переносов 21 сентября 2017 года состоялся релиз Java 9.

Особенности предыдущей (8-й) версии благодаря своей универсальности предоставили разработчикам возможность создавать решения для самых разных секторов бизнеса, включая финтех, здравоохранение и другие индустрии. Среди ключевых нововведений Java 8 следует отметить лямбда-выражения, стримы и изменения в API.

В свою очередь Java 9 также изобилует разнообразием обновлений “под капотом” и в API. Кроме очевидного проекта Jigsaw, на который возложена обязанность по внедрению модулярности в основные компоненты Java, новая версия может похвастаться ещё тремя важными фичами:

  1. Полная поддержка клиента HTTP 2.0: Вопрос в скорости, и HTTP 2.0 предоставляет более высокие результаты, колеблющиеся от 11.81% до 47.7% по сравнении с клиентом HTTP 1.1.
  2. Jshell: Новый инструмент командной строки. Если разработчик хочет автономно запустить несколько строк Java, то это можно выполнить без необходимости заворачивать все в отдельный метод или проект.
  3. Microbenchmark: Теперь производительность отдельных небольших частей кода можно измерить стандартизированным методом. Анализ JMH за наносекунды уникален для Java 9.


С полным списком советуем ознакомиться на портале сообщества Java, а также свободно скачать дистрибутив для ознакомления.

Это, пожалуй, самое ожидаемое нововведение - HTTP клиент с поддержкой как HTTP/2 протокола, так и WebSocket. Ведь SPDY протокол от Google, на базе которого основан HTTP/2 уже демонстрирует улучшенную производительность наравне с Netty или Jetty, поддержку неблокирующего режима (много потоков на запрос/ответ), а также Push-поддержку сервера, позволяющую отправлять ресурсы клиенту без явного запроса.

Новый API представлен как первый инкубаторный модуль для Java - экспериментальная фича, которая при должном развитии официально появится в следующей версии (то есть Java 10), либо будет удалена. Необычный концепт для Java, который поощряет эксперименты, но при этом не нарушает обратной совместимости.

Проект Jigsaw (в переводе “головоломка”) направлен на модуляризацию Java. Это значит, что программный код разбивается на части и организуется по модулям в зависимости от задач, которые эти модули выполняют. Это позволяет использовать модули повторно, упрощает их организацию и отладку. Что ведет к оптимизированной и отлаженной разработке ПО. Это ключевое отличие Java 9 от Java 8.

Второе большое преимущество - Java Platform становится легче и более масштабируемой. Это позволяет Java-приложениям работать даже на устройствах с низкой производительностью (так как для работы требуется меньше ресурсов). Это большое изменение особенно в контексте интернета вещей (IoT). Шаг вперед для Java, и шанс увидеть больше IoT-приложений, написанных на этом языке.

Jshell добавит встроенную поддержку и популяризирует подход Java к REPL (Read-Eval-Print-Loop). Это интерактивный инструмент, позволяющий тестировать небольшие части кода без необходимости создавать новые классы. Он оснащен функциями истории и автозаполнения, а также рядом других особенностей, включая сохранение и загрузку написанных выражений.
Скажем, если захочется запустить несколько строк Java самостоятельно, то теперь не придется заворачивать их в отдельный проект или метод. Что касается точек с запятой - можно забыть про них: Существуют различные альтернативы наподобие плагинов REPL для популярных IDE или веб-консоли Java REPL, но ни одна из них не является официальной.

Добавлена единая система протоколирования всех JVM-компонентов. Тем не менее, если мы посмотрим на плюсы и минусы Java 9, вот один из них. Вызовы протоколирования отдельных компонентов JVM отсутствуют, также как и протоколирование Java-кода в Java Development Kit

Очень часто сталкиваемся с заблуждением, что в Java есть только один сборщик мусора, хотя по факту их 4. Parallel / Throughput Collector считался дефолтным в прошлых версиях, но теперь его заменил G1, который был представлен в Java 7 и был разработан для лучшей поддержки куч размером более 4GB. Он вызывает меньше GC пауз, но если они все же происходят, то длятся дольше.

Этот API позволяет инкапсулировать набор изображений с разными разрешениями в единый объект. Таким образом, разработчик может получить изображение с определенным разрешением или все варианты внутри одного.

Примечательные обновления API: Concurrency и Stack Walking

Java 9 получил обновление CompletableFuture и java.util.concurrent.Flow. Flow - это Java-реализация Reactive Streams API. Reactive Streams помогают решить проблему back-pressure - накопления большого количества данных, которое происходит, когда скорость получения входящих событий выше, чем скорость их обработки приложением, что приводит к появлению буферов необработанных данных. Кроме того, в рамках улучшения concurrency, CompletableFuture получил обновление, которое решило проблемы, выявленные после его внедрения в Java 8. Оно включает поддержку задержек и тайм-аутов, улучшенную поддержку подклассов и несколько полезных методов.

Также хочется упомянуть о Stack Walking API. Все верно, Java 9 меняет подход к работе со стек-трейсами, предоставляя официальный способ обработки стек-трейсов, вместо приравнивания их к простому тексту.

Immutable List, Set, Map, и Map.Entry API

Создание множеств из нескольких элементов в Java 8 требовало нескольких строк кода. Теперь это можно осуществить только одной. Таким образом, один из самых времязатратных недостатков Java 8 был устранен. Это должно облегчить работу с массивами и ускорить некоторые функции.

Преимущества Java 9

Детали отличий Java 9 от Java 8 представляют большой интерес для разработчиков, а следовательно и для бизнеса, находящегося в поиске наилучших решений. Нововведения девятой версии улучшают следующие аспекты разработки:

  • Скорость выше благодаря поддержке клиента HTTP/2.
  • Приложения становятся ресурсоэффективней, потому что разработчики могут использовать только необходимые модули, а не всю JRE.
  • Разработка ускоряется благодаря системе модулей, позволяющей их повторное использование, упрощенную отладку и управление.
  • Появляется возможность анализа производительности очень маленьких частей кода благодаря Microbenchmarks.
  • Множества создаются одной строчкой кода.

Вот такая выжимка всех интересных изменений, которые мы отметили после выхода новой версии. Правда, теперь главный вопрос в том, когда компании начнут внедрять её, учитывая, что встречаются такие, кто ещё и восьмую версию не использует. В итоге пока решили не менять программу курса (не считая мелкой косметики) и оставить всё как есть, а уже в следующем году задуматься насчёт этого.



Рекомендуем почитать

Наверх