Руководство по Java 10
1. Вступление
JDK 10, который является реализацией Java SE 10, был выпущен 20 марта 2018 г.
В этой статье мы рассмотрим новые функции и изменения, представленные в JDK 10.
2. Вывод типа локальной переменной
Перейдите по ссылке для углубленной статьи об этой функции:
3. Неизменяемые коллекции
В Java 10 есть несколько изменений, связанных с неизменяемыми коллекциями.
3.1. copyOf()с
java.util.List,java.util.Map andjava.util.Set each получил новый статический методcopyOf(Collection).
Возвращает неизменяемую копию заданногоCollection:
@Test(expected = UnsupportedOperationException.class)
public void whenModifyCopyOfList_thenThrowsException() {
List copyList = List.copyOf(someIntList);
copyList.add(4);
}
Любая попытка изменить такую коллекцию приведет к исключениюjava.lang.UnsupportedOperationExceptionruntime.
3.2. toUnmodifiable*()с
java.util.stream.Collectors получить дополнительные методы для сбора неизменяемогоStream intoList,Map orSet:
@Test(expected = UnsupportedOperationException.class)
public void whenModifyToUnmodifiableList_thenThrowsException() {
List evenList = someIntList.stream()
.filter(i -> i % 2 == 0)
.collect(Collectors.toUnmodifiableList());
evenList.add(4);
}
Любая попытка изменить такую коллекцию приведет к исключениюjava.lang.UnsupportedOperationExceptionruntime.
4. Optional.orElseThrow () *
java.util.Optional,java.util.OptionalDouble,java.util.OptionalIntandjava.util.OptionalLongeach получил новый методorElseThrow()w, который не принимает никаких аргументов и выдаетNoSuchElementException, если значение отсутствует:
@Test
public void whenListContainsInteger_OrElseThrowReturnsInteger() {
Integer firstEven = someIntList.stream()
.filter(i -> i % 2 == 0)
.findFirst()
.orElseThrow();
is(firstEven).equals(Integer.valueOf(2));
}
Это синоним и сейчас является предпочтительной альтернативой существующему методуget().
5. Улучшения производительности
Перейдите по ссылке для углубленной статьи об этой функции:
6. Осведомленность о контейнерах
JVMs are now aware of being run in a Docker container and будет извлекать конфигурацию, специфичную для контейнера, вместо того, чтобы запрашивать саму операционную систему - он применяется к таким данным, как количество процессоров и общий объем памяти, которые были выделены для контейнера.
Однако эта поддержка доступна только для платформ на основе Linux. Эта новая поддержка включена по умолчанию и может быть отключена в командной строке с опцией JVM:
-XX:-UseContainerSupport
Кроме того, это изменение добавляет опцию JVM, которая предоставляет возможность указать количество процессоров, которые будет использовать JVM:
-XX:ActiveProcessorCount=count
Кроме того, были добавлены три новых параметра JVM, чтобы позволить пользователям контейнера Docker получить более детальный контроль над объемом системной памяти, которая будет использоваться для Java Heap:
-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
7. Корневые сертификаты
Хранилище ключей cacerts, которое до сих пор было пустым, должно содержать набор корневых сертификатов, которые можно использовать для установления доверия в цепочках сертификатов, используемых различными протоколами безопасности.
В результате критически важные компоненты безопасности, такие как TLS, не работали по умолчанию в сборках OpenJDK.
With Java 10, Oracle has open-sourced the root certificates ошибается в программе Oracle Java SE Root CA, чтобы сделать сборки OpenJDK более привлекательными для разработчиков и уменьшить различия между этими сборками и сборками Oracle JDK.
8. Устаревание и удаление
8.1. Параметры и инструменты командной строки
Инструментjavah has был удален из Java 10, который генерировал заголовки C и исходные файлы, которые требовались для реализации собственных методов - теперь вместо этого используется сканированиеjavac -h .
policytool заменил инструмент на основе пользовательского интерфейса для создания файлов политик и управления ими. Теперь это было удалено. Пользователь может использовать простой текстовый редактор для выполнения этой операции.
Удаленjava -Xprofoption. Опция использовалась для профилирования работающей программы и отправки данных профилирования на стандартный вывод. Вместо этого пользователь должен использовать табуретjmap .
8.2. APIs
Устаревший пакет java.security.acl помечен как forRemoval = true и подлежит удалению в будущей версии Java SE. Он был заменен на классы, связанные с пескомjava.security.Policy .
Точно так же API java.security. \ {Certificate, Identity, IdentityScope, Signer} помечены какforRemoval=true.
9. Управление версиями выпусков по времени
Начиная с Java 10, Oracle перешла на основанный на времени выпуск Java. Это имеет следующие последствия:
-
A new Java release every six months. Выпуск за март 2018 г. - это JDK 10, выпуск за сентябрь 2018 г. - это JDK 11 и т. д. Они называются выпусками функций и, как ожидается, будут содержать как минимум одну или две важные функции.
-
Support for the feature release will last only for six months, то есть до следующего выпуска функции
-
Выпуск долгосрочной поддержки будет отмечен как LTS. Поддержка такого релиза будет три года.
-
Java 11 будет релизом LTS
java -version will now contain the GA date, что упрощает определение возраста выпуска:
$ java -version
openjdk version "10" 2018-03-20
OpenJDK Runtime Environment 18.3 (build 10+46)
OpenJDK 64-Bit Server VM 18.3 (build 10+46, mixed mode)
10. Заключение
В этой статье мы увидели новые функции и изменения, внесенные в Java 10.
Как обычно, фрагменты кода можно найтиover on GitHub.