JavaRush /Blog Java /Random-FR /Nouveau Java... Encore une fois... Découvrez Java 10

Nouveau Java... Encore une fois... Découvrez Java 10

Publié dans le groupe Random-FR
Auparavant, les développeurs attendaient un nouveau Java depuis plusieurs années, certains avec horreur, d'autres avec espoir. Les temps ont changé, et de nouvelles versions du JDK nous raviront tous les six mois. Si vous ne savez pas encore exactement à quoi cela va conduire, consultez l'avis de l'expert et nous énumérerons ici les principaux changements apportés à Java 10 - la dernière version de notre langage préféré. Nouveau Java... Encore une fois... Découvrez Java 10 - 1Entre crochets avant la nouvelle « fonctionnalité », le numéro JEP est indiqué, c'est-à-dire « JDK Enchancement Proposal ». JEP est une proposition visant à améliorer OpenJDK et peut être approuvée, retardée ou rejetée. Autrement dit, une collection de JEP constitue essentiellement une stratégie de développement pour OpenJDK.

Fonctionnalités importantes de Java 10

[286] Inférence de type de variable locale - Une proposition visant à introduire le mot-clé var dans Java, éliminant ainsi le besoin de spécifier explicitement le type d'une variable locale. Autrement dit, vous ne pouvez plus spécifier le type de la variable initialisée, mais écrire quelque chose comme :
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
Cela élimine la duplication de la définition de type ArrayList<String> que nous aurions dû utiliser auparavant. Il est intéressant de noter que var ne devient pas un mot-clé, mais un type réservé. Autrement dit, vous pouvez utiliser var comme nom d'une variable, d'une méthode ou d'un package. Mais vous ne pourrez pas nommer la classe de cette façon (quelle perte !). [296] Fusion de la forêt JDK en un seul référentiel . JDK 9 dispose de huit référentiels : root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn. Dans Java 10, toute cette forêt sera combinée en un seul référentiel pour permettre d'effectuer des validations atomiques sur des référentiels d'ensembles de modifications interdépendants. [304] L'interface Garbage-Collector n'est pas une interface qui peut être utilisée par les développeurs pour contrôler le garbage collection. Au lieu de cela, nous obtenons une interface propre de garbage collector dans le code source de la JVM, vous permettant d'intégrer rapidement et facilement des collecteurs alternatifs. Ceux qui rêvaient d'ajouter leur propre garbage collector à la JVM seront très satisfaits de cette amélioration. [307] Parallel Full GC pour le ramasse-miettes G1 . Dans JDK 9, G1 est devenu le ramasse-miettes par défaut, alors qu'auparavant, le ramasse-miettes par défaut était Parallel GC, qui pouvait collecter les ordures sur plusieurs threads. Maintenant, G1 peut également le faire ; auparavant, il le faisait dans un seul thread, ce qui causait parfois des difficultés. À propos, les développeurs pourront configurer le nombre de threads à l'aide du paramètre - XX:ParallelGCThreads. [310] Application Class-Data Sharing - ce développement, adopté dans Java 10, offre un chargement et un suivi améliorés, étend la fonctionnalité de partage de classes (CDS) existante. pour permettre aux classes d'application d'être localisées dans les archives générales. Partage de données de classe ou CDS pour de courts travaux avec des fichiers avec l'extension *class. Cette fonction vous permet de sélectionner un certain sous-ensemble de classes, de les traiter et de les compresser dans une archive spéciale. Tout cela est fait pour économiser de la mémoire. Souvent, différentes instances de la JVM chargent les mêmes classes incluses dans la bibliothèque standard. Et CDS permet à toutes ces instances JVM de partager une seule archive avec les classes qui y sont placées. Cela réduit à la fois le temps de chargement du programme et l’utilisation de la mémoire. En fait, CDS améliore les performances de démarrage de la JVM et réduit l'empreinte des ressources lorsque plusieurs JVM s'exécutent sur la même machine physique ou virtuelle, à partir de la version 5. Mais auparavant, l'utilisation de CDS était limitée au chargeur d'amorçage uniquement. Désormais, une version étendue appelée Application CDS vous permet de charger des archives spéciales avec des classes pour d'autres chargeurs. [312] Thread-Local Handshakes est un changement de niveau assez bas au sein de la JVM qui permettra d'exécuter des rappels entre les threads sans exécuter un point de sécurité global de la VM. Cela vous permettra d'arrêter sans frais des threads individuels, plutôt que tous d'un coup (ou aucun). [313] Supprimez l'outil de génération d'en-tête natif (javah) . De retour dans Java 9, les développeurs de langage ont commencé à supprimer activement les outils inutiles, et JEP 313 poursuit ce bon travail. L'outil javah génère des en-têtes JNI s'il existe des méthodes natives dans le code. En bonne santé? Bien sûr, mais le compilateur javac natif, à partir du JDK 8, peut lui-même générer des en-têtes JNI. Alors maintenant, ils ont décidé de se débarrasser de Javah. D'ailleurs, le projet Panama est en cours de développement , qui pourrait notamment remplacer JNI. [314] Extensions supplémentaires de balises de langage Unicode Cette modification vise à améliorer la classe java.util.Locale et les API associées pour implémenter des extensions Unicode supplémentaires aux balises de langage BCP 47. En particulier, les balises pour le type de devise (cu), premier jour sera désormais pris en charge pour les remplacements de semaine (fw), de région (rg) et de fuseau horaire (tz). [316] Allocation de tas sur des dispositifs de mémoire alternatifs Cette innovation aidera ceux qui utilisent des types de mémoire autres que la DRAM. Les technologies étant en constante évolution, l'utilisation de mémoire non volatile avec la même interface et les mêmes caractéristiques de performances similaires à la DRAM est aujourd'hui une réalité objective. Ainsi, JEP 316 permet à la JVM de placer un tas dans d'autres types de mémoire. [317] Compilateur JIT expérimental basé sur Java . Le projet Metropolis a été récemment annoncé, qui propose de réécrire l'essentiel de la JVM en Java. Au cas où vous ne le sauriez pas, la version actuelle est écrite en C++. Eh bien, si vous êtes déjà au courant, une telle idée vous semblera probablement étrange au début. Puisque la JVM est écrite en Java, n’auriez-vous pas besoin d’une JVM pour exécuter la JVM ? Telle est la récursion, qui fait penser à des miroirs opposés. Cependant, la réalité est un peu différente : ce n'est pas parce que la JVM est écrite en Java que vous devez la compiler en bytecodes. Vous pouvez réellement utiliser la compilation AOT, puis JIT compile le code au fur et à mesure qu'il améliore les performances.

Un outil tel que javac est couramment utilisé pour compiler du code Java. Il convertit un programme Java en un ensemble de fichiers de classe avec des bytecodes. Ensuite, la JVM exécute votre bytecode et son interpréteur les convertit en instructions processeur. En plus de l'interpréteur, la JVM dispose également d'un compilateur intégré et peut également créer des instructions pour le processeur à partir du bytecode. C'est ce qu'on appelle la compilation d'exécution, compilation au démarrage. Habituellement, le code le plus souvent utilisé est soumis à une telle compilation, ce qui améliore les performances.

Le compilateur peut effectuer des actions de différentes manières : compilation JIT (juste à temps) - dynamique, juste pendant l'exécution du programme, ou compilation AOT (à l'avance) - avant l'exécution.

Le compilateur jaotc AOT a été introduit dans JDK 9. Actuellement, la JVM Hotspot contient deux compilateurs JIT, C1 (pour la vitesse) et C2 (pour l'optimisation).

JEP 317 présente le projet de recherche Graal, un compilateur pour le JDK. Il s'agit d'une certaine base qui contribuera à faire de Metropolis une réalité et permettra à la JVM d'égaler (ou mieux encore, de dépasser) la version actuelle écrite en C++ en termes de performances. [319] Les certificats racines constituent l'ensemble par défaut de certificats d'autorité de certification (CA) standard dans le JDK. Les composants de sécurité critiques tels que TLS fonctionneront désormais par défaut dans les versions OpenJDK. Cet ajout utile fait probablement partie de ce que fait Oracle pour garantir que les binaires OpenJDK et les binaires Oracle JDK sont fonctionnellement identiques. [322] Gestion des versions basée sur le temps - dans Java 10, de nouvelles fonctionnalités seront ajoutées aux versions de fonctionnalités et les bogues seront corrigés dans les versions de mise à jour. Essentiellement, nous avons une nouvelle façon de définir les formats de chaîne de version du JDK. Il corrige une situation assez étrange avec le JDK 9. La première mise à jour était le JDK 9.0.1, ce qui est assez logique. La deuxième mise à jour est JDK 9.0.4, ce qui est illogique. La logique est que dans le schéma de numérotation des versions du JDK 9, un espace est laissé entre les mises à jour en cas de mise à jour d'urgence non planifiée. Puisque la mise à jour n'était pas nécessaire, pourquoi ne pas simplement l'appeler JDK 9.0.2 ? Et voici à quoi ressemble le nouveau format de la version Java :
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

Nouvelles API

Il existe 73 ajouts aux bibliothèques de classes standard du JDK 10.
  • java.awt.Toolkit

    int getMenuShortcutKeyMaskEx (): Définit quelle touche de modification étendue est la touche d'accélérateur correspondante pour le menu contextuel.

  • java.awt.geom.Path2D :

    void trimToSize (): réduit la capacité de cette instance Path2Dà sa taille actuelle. Une application peut utiliser cette opération pour minimiser le stockage du chemin. La même méthode a été ajoutée aux classes internes Path2D.Doubleet Path2D.Float.

  • java.io.ByteArrayOutputStream :

    String toString (Charset): surchargé toString, convertit le contenu d'un tampon en chaîne en décodant les octets en utilisant l'encodage spécifié.

  • java.io.PrintStream et lang.io.PrintWriter :

    Ces deux classes ont trois nouveaux constructeurs qui acceptent un argument supplémentaire charset.

  • java.io.Reader :

    long transferTo (Writer): Lit tous les caractères de ce lecteur et écrit les caractères sur l'écrivain donné dans l'ordre dans lequel ils sont lus.

  • java.lang.Runtime.Version :

    Quatre nouvelles méthodes qui renvoient une valeur entière pour la nouvelle version (JEP 322) des champs de chaîne : feature (), interim (), patch ()et update ().

  • java.lang.StackWalker.StackFrame :

  • Chaîne getDescriptor() :

    renvoie un handle vers la méthode représentée par ce cadre de pile, tel que défini par la spécification de machine virtuelle Java.

  • Chaîne getMethodType() :

    renvoie MethodType, représentant les types de paramètres et le type de retour pour la méthode représentée par le cadre de pile.

  • java.lang.invoke.MethodType :

    Class <?> LastParameterType (): возвращает последний тип параметра этого типа метода. Если этот тип не имеет параметров, instead of него возвращается meaning sentinel void.class.

  • java.lang.management.RuntimeMXBean:

    long getPid () возвращает pid запущенной виртуальной машины Java.

  • java.lang.management.ThreadMXBean:

    ThreadInfo [] dumpAllThreads (boolean, boolean, int): возвращает информацию о потоке для всех потоков в реальном времени с трассировкой стека с указанным максимальным количеством элементов и информацией о синхронизации.

  • ThreadInfo [] getThreadInfo (long [], boolean, boolean, int):

    возвращает информацию о потоке для каждого потока, чья идентификация находится во входном массиве, с трассировкой стека указанного максимального количества элементов и информацией о синхронизации.

  • java.lang.reflect.MalformedParameterizedTypeException:

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

  • java.net.URLDecoder и java.net.URLEncoder:

    оба этих класса получor новые перегруженные методы расcodeирования и codeирования, которые используют charset в качестве дополнительного параметра.

  • java.nio.channels.Channels:

    Два новых статических перегруженных метода, newReader (ReadByteChannel, Charset) и newWriter (WriteByteChannel, Charset), которые позволяют использовать charset.

  • java.nio.file.FileStore:

    long getBlockSize (): возвращает количество byteов на блок в этом хранorще файлов.

  • java.time.chrono:

    три класса в этом пакете, HijrahEra, MiinguoEra и ThaiBuddhistEra, получor метод String getDisplayName (TextStyle, Locale). Он возвращает текстовое Name, используемое для идентификации эпохи, подходящее для представления пользователю.

  • java.time.format.DateTimeFormatter:

    localizedBy (Locale): возвращает копию этого форматтера с локализованными значениями языка, календаря, региона, десятичного стиля и / or часового пояса, которые заменяют значения в этом формате.

  • java.util:

    DoubleSummaryStatistics, IntSummaryStatistics и LongSummaryStatistics получor новый конструктор, который принимает четыре числовых значения. Он создает непустой экземпляр с указанным счетчиком, минимумом, максимумом и суммой.

  • java.util.List, java.util.Map и java.util.Set:

    каждый из этих интерфейсов обзавёлся новым статическим методом copyOf (Collection). Они возвращают неизменяемые List, Map or Set, содержащие элементы данной коллекции, в своем порядке итерации.

  • java.util.Optional, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong:

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

  • java.util.Formatter и java.util.Scanner:

    Оба этих класса получor три новых конструктора, которые на вход получают charset в дополнение к другим аргументам.

  • java.util.Properties:

    Здесь появился новый конструктор, который принимает аргумент int. Это создает пустой список свойств без значений по умолчанию и с начальным размером, содержащим указанное количество элементов без необходимости динамического изменения размера. Также появилась новая, перегруженная version метода replace, которая принимает три параметра Object и возвращает логическое meaning.

  • java.SplittableRandom:

    void nextBytes (byte []): заполняет предоставленный пользователем массив byteов с генерируемыми псевдослучайными byteами.

  • java.util.concurrent.FutureTask:

    добавлен метод toString (), который возвращает строку, идентифицирующую FutureTask, а также ее состояние завершения. Состояние (в скобках) содержит одну из строк: «Completed Normally» (нормальное завершение), «Completed Exceptionally» (завершение с исключением), «Cancelled» (отменено) or «Not completed» (не завершено).

  • java.util.concurrent.locks.StampedLock:

    новые методы boolean isLockStamp (long), boolean isOptimisticReadStamp (long), boolean isReadLockStamp (long) и boolean isWriteLockStamp (long).

  • java.jar.JarEntry:

    String getRealName (): возвращает настоящее Name этого JarEntry. Если JarEntry является записью мультирелизного jar-file, настроенного для обработки, тогда Name, возвращаемое этим методом — Name пути версии, которую представляет JarEntry. Иначе JarEntry возвращает то же Name, что и ZipEntry.getName ().

  • java.util.jar.JarFile:

    Stream <JarEntry> versionedStream (): возвращает поток записей в файле с версией jar. Подобно методу getRealName для JarEntry, связан с мультирелизными jar-fileми.

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): возвращает локализованное Name для данного Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): возвращает локализованное Name для данного Unicode extension key.

  • java.util.stream.Collectors:

    toUnmodifiableList (), toUnmodifiableSet (), toUnmodifiableMap (Function, Function), toUnmodifiableMap (Function, Function, BinaryOperator) — эти четыре новых метода возвращают коллекторы (Collectors), которые накапливают входные элементы в соответствующую немодифицируемую коллекцию.

  • java.lang.model.SourceVersion:

    теперь это поле RELEASE_10 для представления версии JDK 10.

  • java.lang.model.util.TypeKindVisitor6 и javax.lang.model.util.TypeKindVisitor9:

    что-то не вполне понятное:).

  • R visitNoTypeAsModule (NoType, P):

    посещает псевдо-тип MODULE.

  • javax.remote.management.rmi.RMIConnectorServer:

    У этого класса было добавлено два поля: CREDENTIALS_FILTER_PATTERN и SERIAL_FILTER_PATTERN.

  • javax.ButtonModel:

    Представляете, Swing все еще обновляется!

  • ButtonGroup getGroup ():

    возвращает группу, к которой принадлежит кнопка. Обычно используется с radio buttons, которые являются взаимоисключающими в своей группе.

  • javax.plaf.basic.BasicMenuUI:

    Dimension getMinimumSize (JComponent): возвращает минимальный размер указанного компонента, подходящий для внешнего вида.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION