JavaRush /Java Blog /Random-IT /Nuovo Java... Ancora una volta... Ecco Java 10

Nuovo Java... Ancora una volta... Ecco Java 10

Pubblicato nel gruppo Random-IT
In precedenza, gli sviluppatori aspettavano un nuovo Java da diversi anni, alcuni con orrore, altri con speranza. I tempi sono cambiati e le nuove versioni del JDK ci delizieranno ogni sei mesi. Se non ti è ancora chiaro a cosa porterà questo, dai un’occhiata al parere dell’esperto , e qui elencheremo le principali novità di Java 10, l’ultima versione del nostro linguaggio preferito. Nuovo Java... Ancora una volta... Scopri Java 10 - 1Tra parentesi quadre prima della nuova “caratteristica” è indicato il numero JEP, ovvero “JDK Enchancement Proposal”. JEP è una proposta per migliorare OpenJDK e può essere approvata, ritardata o rifiutata. Cioè, in sostanza, una raccolta di PEC è una strategia di sviluppo per OpenJDK.

Caratteristiche importanti di Java 10

[286] Inferenza del tipo di variabile locale - Una proposta per introdurre la parola chiave var in Java, eliminando la necessità di specificare esplicitamente il tipo di una variabile locale. Cioè, ora non puoi specificare il tipo della variabile inizializzata, ma scrivere qualcosa del tipo:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
Ciò elimina la duplicazione della definizione del tipo ArrayList<String> che avremmo dovuto utilizzare prima. È interessante notare che var non diventa una parola chiave, ma è un tipo riservato. Cioè puoi usare var come nome di una variabile, di un metodo o di un pacchetto. Ma non potrai nominare la classe in quel modo (che perdita!). [296] Unione della foresta JDK in un unico repository . JDK 9 ha otto repository: root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn. In Java 10, l'intera foresta verrà combinata in un unico repository per rendere possibile l'esecuzione di commit atomici tra repository di changeset interdipendenti. [304] L'interfaccia Garbage-Collector non è un'interfaccia che può essere utilizzata dagli sviluppatori per controllare la raccolta dei rifiuti. Invece, otteniamo un'interfaccia pulita del garbage collector nel codice sorgente JVM, che consente di integrare rapidamente e facilmente raccoglitori alternativi. Coloro che sognavano di aggiungere il proprio garbage collector alla JVM saranno molto soddisfatti di questo miglioramento. [307] GC completo parallelo per il Garbage Collector G1 . In JDK 9, G1 è diventato il garbage collector predefinito, mentre in precedenza il garbage collector predefinito era Parallel GC, che poteva raccogliere i rifiuti su più thread. Ora anche G1 può farlo; prima lo faceva in un thread, il che a volte causava difficoltà. A proposito, gli sviluppatori saranno in grado di configurare il numero di thread utilizzando il parametro - XX:ParallelGCThreads. [310] Application Class-Data Sharing - questo sviluppo, adottato in Java 10, offre caricamento e tracciamento migliorati, estende la funzionalità Class Sharing (CDS) esistente per consentire l'ubicazione delle classi dell'applicazione nell'archivio generale. Class-Data Sharing o CDS per lavori brevi con file con estensione *class. Questa funzione consente di selezionare un determinato sottoinsieme di classi, elaborarle e comprimerle in un archivio speciale. Tutto questo viene fatto per risparmiare memoria. Spesso istanze diverse della JVM caricano le stesse classi incluse nella libreria standard. E CDS consente a tutte queste istanze JVM di condividere un singolo archivio con le classi in esso inserite. Ciò riduce sia il tempo di caricamento del programma che l'utilizzo della memoria. Di fatto, CDS migliora le prestazioni di avvio della JVM e riduce l'ingombro delle risorse quando più JVM sono in esecuzione sulla stessa macchina fisica o virtuale, a partire dalla versione 5. Ma in precedenza l'uso di CDS era limitato al solo caricamento bootstrap. Ora una versione estesa chiamata Application CDS consente di caricare archivi speciali con classi per altri caricatori. [312] Thread-Local Handshakes è una modifica di livello abbastanza basso all'interno della JVM che consentirà l'esecuzione di callback tra thread senza eseguire un punto di sicurezza VM globale. Ciò ti consentirà di interrompere senza costi singoli thread, anziché tutti in una volta (o nessuno). [313] Rimuovere lo strumento di generazione dell'intestazione nativa (javah) . Già in Java 9, gli sviluppatori del linguaggio hanno iniziato a rimuovere attivamente gli strumenti non necessari e JEP 313 continua questo buon lavoro. Lo strumento Javah genera intestazioni JNI se sono presenti metodi nativi nel codice. Salutare? Naturalmente, ma il compilatore Java nativo, a partire da JDK 8, può generare esso stesso intestazioni JNI. Quindi ora hanno deciso di sbarazzarsi di Javah. A proposito, attualmente è in fase di sviluppo il progetto Panama che, in particolare, può sostituire la JNI. [314] Estensioni aggiuntive dei tag di lingua Unicode Questa modifica ha lo scopo di migliorare la classe java.util.Locale e le API associate per implementare ulteriori estensioni Unicode ai tag di lingua BCP 47. In particolare, i tag per il tipo di valuta (cu), primo giorno saranno ora supportate le sostituzioni di settimana (fw), regione (rg) e fuso orario (tz). [316] Allocazione dell'heap su dispositivi di memoria alternativi Questa innovazione aiuterà coloro che utilizzano tipi di memoria diversi dalla DRAM. Poiché le tecnologie sono in continua evoluzione, l'uso di memoria non volatile con la stessa interfaccia e caratteristiche prestazionali simili alla DRAM è oggi una realtà oggettiva. Pertanto, JEP 316 consente alla JVM di posizionare un heap in altri tipi di memoria. [317] Compilatore JIT sperimentale basato su Java . Recentemente è stato annunciato il progetto Metropolis, che propone di riscrivere gran parte della JVM in Java. Nel caso non lo sapessi, la versione attuale è scritta in C++. Ebbene, se lo sai già, probabilmente all'inizio un'idea del genere ti sembrerà strana. Poiché la JVM è scritta in Java, non avresti bisogno di una JVM per eseguire la JVM? Questa è la ricorsione, che ricorda gli specchi uno di fronte all'altro. Tuttavia, la realtà è leggermente diversa: solo perché la JVM è scritta in Java, ciò non significa che devi compilarla in bytecode. Puoi effettivamente utilizzare la compilazione AOT e quindi JIT compila il codice mentre funziona per migliorare le prestazioni.

Uno strumento come javac viene comunemente utilizzato per compilare il codice Java. Converte un programma Java in un insieme di file di classe con bytecode. Successivamente, la JVM esegue il tuo bytecode e il suo interprete li converte in istruzioni del processore. Oltre all'interprete, la JVM ha anche un compilatore integrato e può anche creare istruzioni per il processore dal bytecode. Questa è la cosiddetta compilazione runtime, compilazione durante l'avvio. Di solito il codice utilizzato più spesso viene sottoposto a tale compilazione: ciò migliora le prestazioni.

Il compilatore può eseguire azioni in diversi modi: compilazione JIT (just-in-time) - dinamica, proprio durante l'esecuzione del programma o compilazione AOT (in anticipo) - prima dell'esecuzione.

Il compilatore AOT jaotc è stato introdotto in JDK 9. Attualmente, la JVM Hotspot contiene due compilatori JIT, C1 (per la velocità) e C2 (per l'ottimizzazione).

JEP 317 introduce il progetto di ricerca Graal, un compilatore per JDK. Questa è una base certa che aiuterà a rendere Metropolis una realtà e consentirà alla JVM di eguagliare (o meglio ancora, superare) la versione attuale scritta in C++ in termini di prestazioni. [319] I certificati root sono il set predefinito di certificati standard dell'autorità di certificazione (CA) nel JDK. I componenti critici di sicurezza come TLS ora funzioneranno per impostazione predefinita nelle build OpenJDK. Questa utile aggiunta fa probabilmente parte di ciò che Oracle sta facendo per garantire che i file binari OpenJDK e Oracle JDK siano funzionalmente uguali. [322] Versioni delle versioni basate sul tempo : in Java 10, nuove funzionalità verranno aggiunte alle versioni delle funzionalità e i bug verranno corretti nelle versioni degli aggiornamenti. Essenzialmente, abbiamo un nuovo modo per impostare i formati delle stringhe della versione JDK. Risolve una situazione piuttosto strana con JDK 9. Il primo aggiornamento è stato JDK 9.0.1, il che è abbastanza logico. Il secondo aggiornamento è JDK 9.0.4, il che è illogico. La logica è che all'interno dello schema di numerazione delle versioni JDK 9, viene lasciato spazio tra gli aggiornamenti in caso di aggiornamento di emergenza e non pianificato. Dato che l'aggiornamento non era necessario, perché non chiamarlo semplicemente JDK 9.0.2? Ed ecco come appare il nuovo formato della versione Java:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

Nuove API

Sono presenti 73 aggiunte alle librerie di classi standard JDK 10.
  • java.awt.Toolkit

    int getMenuShortcutKeyMaskEx (): definisce quale tasto modificatore esteso è il tasto acceleratore corrispondente per il menu di scelta rapida.

  • java.awt.geom.Path2D:

    void trimToSize (): riduce la capacità di questa istanza Path2Dalla dimensione corrente. Un'applicazione può utilizzare questa operazione per ridurre al minimo l'archiviazione del percorso. Lo stesso metodo è stato aggiunto alle classi interne Path2D.Doublee Path2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): sovraccarico toString, converte il contenuto di un buffer in una stringa decodificando i byte utilizzando la codifica specificata.

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

    Entrambe queste classi hanno tre nuovi costruttori che accettano un argomento aggiuntivo charset.

  • java.io.Reader:

    long transferTo (Writer): Legge tutti i caratteri da questo lettore e li scrive allo scrittore specificato nell'ordine in cui vengono letti.

  • java.lang.Runtime.Version:

    Quattro nuovi metodi che restituiscono un valore intero per la nuova versione (JEP 322) dei campi stringa: feature (), interim (), patch ()e update ().

  • java.lang.StackWalker.StackFrame:

  • Stringa getDescriptor():

    restituisce un handle al metodo rappresentato da questo stack frame, come definito dalla specifica Java Virtual Machine.

  • Stringa getMethodType():

    restituisce MethodType, che rappresenta i tipi di parametro e il tipo restituito per il metodo rappresentato dallo stack frame.

  • java.lang.invoke.MethodType:

    Class<?> LastParameterType(): restituisce l'ultimo tipo di parametro di questo tipo di metodo. Se questo tipo non ha parametri, viene restituito invece il valore sentinel void.class.

  • java.lang.management.RuntimeMXBean:

    long getPid ()restituisce pidla macchina virtuale Java in esecuzione.

  • java.lang.management.ThreadMXBean:

    ThreadInfo [] dumpAllThreads (boolean, boolean, int):restituisce informazioni sul thread per tutti i thread in tempo reale con un'analisi dello stack con il numero massimo specificato di elementi e informazioni sulla tempistica.

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

    restituisce informazioni sul thread per ogni thread la cui identificazione è nell'array di input, con un'analisi dello stack del numero massimo specificato di elementi e informazioni di sincronizzazione.

  • java.lang.reflect.MalformedParameterizedTypeException:

    è stato aggiunto un nuovo costruttore che accetta come parametro un messaggio dettagliato come una stringa.

  • java.net.URLDecoder e java.net.URLEncoder:

    entrambe queste classi hanno nuovi metodi di decodifica e codifica sovraccaricati che vengono utilizzati charsetcome parametro aggiuntivo.

  • java.nio.channels.Canali:

    Due nuovi metodi di sovraccarico statico newReader (ReadByteChannel, Charset)e newWriter (WriteByteChannel, Charset), che consentono di utilizzare charset.

  • java.nio.file.FileStore:

    long getBlockSize (): Restituisce il numero di byte per blocco in questo archivio di file.

  • 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): Restituisce il nome localizzato per questo file Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): Restituisce il nome localizzato per questo file Unicode extension key.

  • java.util.stream.Collectors:

    toUnmodifiableList (), toUnmodifiableSet (), toUnmodifiableMap (Function, Function), toUnmodifiableMap (Function, Function, BinaryOperator)- Questi quattro nuovi metodi restituiscono Collector che accumulano gli elementi di input in una raccolta non modificabile corrispondente.

  • java.lang.model.SourceVersion:

    questo ora è un campo RELEASE_10 per rappresentare la versione JDK 10.

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

    qualcosa non è del tutto chiaro :).

  • R visitNoTypeAsModule(NoType, P):

    visite pseudo-tipo MODULE.

  • javax.remote.management.rmi.RMIConnectorServer:

    A questa classe sono stati aggiunti due campi: CREDENTIALS_FILTER_PATTERN и SERIAL_FILTER_PATTERN.

  • javax.ButtonModel:

    Indovina un po', Swing è ancora in fase di aggiornamento!

  • ButtonGroup getGroup():

    restituisce il gruppo a cui appartiene il pulsante. Tipicamente utilizzato con radio buttons, che si escludono a vicenda all'interno del loro gruppo.

  • javax.plaf.basic.BasicMenuUI:

    Dimension getMinimumSize (JComponent): restituisce la dimensione minima del componente specificato appropriata per l'aspetto.

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