Versione Java SE 14

Dopo sei mesi di sviluppo, Oracle rilasciato una piattaforma JavaSE 14 (Piattaforma Java, Standard Edition 14), il progetto open source OpenJDK viene utilizzato come implementazione di riferimento. Java SE 14 mantiene la compatibilità con le versioni precedenti della piattaforma Java; tutti i progetti Java scritti in precedenza funzioneranno senza modifiche una volta lanciati con la nuova versione. Build Java SE 14 pronte per l'installazione (JDK, JRE e Server JRE) preparato per Linux (x86_64), Windows e macOS. Implementazione di riferimento sviluppata dal progetto OpenJDK Java 14 è completamente open source sotto la licenza GPLv2, con eccezioni GNU ClassPath che consentono il collegamento dinamico con prodotti commerciali.

Java SE 14 è classificato come rilascio di supporto generale e continuerà a ricevere aggiornamenti fino al rilascio successivo. Il ramo Long Term Support (LTS) dovrebbe essere Java SE 11, che continuerà a ricevere aggiornamenti fino al 2026. Il precedente ramo LTS di Java 8 sarà supportato fino a dicembre 2020. La prossima versione LTS è prevista per settembre 2021. Ricordiamo che a partire dal rilascio di Java 10, il progetto è passato a un nuovo processo di sviluppo, implicando un ciclo più breve per la formazione di nuove versioni. Le nuove funzionalità sono ora sviluppate in un ramo principale costantemente aggiornato, che include modifiche già pronte e da cui si diramano i rami ogni sei mesi per stabilizzare le nuove versioni.

Di innovazioni Java 14 si può contrassegno:

  • Aggiunto supporto sperimentale corrispondenza dei modelli nell'operatore “instanceof”, che consente di definire immediatamente una variabile locale per accedere al valore controllato. Ad esempio, puoi scrivere immediatamente "if (obj istanza di String s && s.length() > 5) {.. s.contains(..) ..}" senza definire esplicitamente "String s = (String) obj".

    Era:

    if (istanza oggetto del Gruppo) {
    Gruppo gruppo = (Gruppo) oggetto;
    var voci = group.getEntries();
    }

    Ora puoi fare a meno della definizione “Group group = (Group) obj”:

    if (istanza oggetto del gruppo Gruppo) {
    var voci = group.getEntries();
    }

  • Aggiunto supporto sperimentale per la nuova parola chiave "record", che fornisce un formato compatto per la definizione delle classi, consentendo di evitare di definire esplicitamente vari metodi di basso livello come equals(), hashCode() e toString() nei casi in cui i dati vengono archiviati solo in campi il cui comportamento non cambia. Quando una classe utilizza implementazioni standard dei metodi equals(), hashCode() e toString(), può fare a meno della loro definizione esplicita:

    record pubblico BankTransaction (data LocalDate,
    importo doppio
    Descrizione stringa) {}

    Questa dichiarazione aggiungerà automaticamente le implementazioni dei metodi equals(), hashCode() e toString() oltre ai metodi costruttore e getter.

  • Standardizzato ed è abilitato per impostazione predefinita il supporto per una nuova forma di espressioni "switch", che non richiede la specifica dell'operatore "break", consente di combinare etichette ripetute e può essere utilizzata non solo sotto forma di operatore, ma anche come espressione.

    var log = interruttore (evento) {
    caso PLAY -> “L'utente ha attivato il pulsante di riproduzione”;
    caso STOP, PAUSA -> “L'utente ha bisogno di una pausa”;
    predefinito -> {
    Stringa messaggio = event.toString();
    LocalDateTime now = LocalDateTime.now();
    return "Evento sconosciuto" + messaggio +
    » connesso » + ora;
    }
    };

  • Supporto sperimentale ampliato blocchi di testo - una nuova forma di stringhe letterali che consente di includere dati di testo su più righe nel codice sorgente senza utilizzare l'escape dei caratteri e preservando la formattazione del testo originale nel blocco. Il blocco è racchiuso tra tre virgolette doppie. In Java 14, i blocchi di testo ora supportano la sequenza di escape "\s" per definire un singolo spazio e "\" per concatenarsi con la riga successiva (ignorando i ritorni a capo quando è necessario stampare una riga molto lunga). Ad esempio, invece di code

    StringaHTML = " »+
    "\n\t" + " »+
    "\n\t\t" + " \"Java 1 è qui!\" »+
    "\n\t" + " »+
    "\n" + " ";

    puoi specificare:

    Stringa html = """


    »Java 1\
    è qui!

    """;

  • Il contenuto informativo della diagnostica in caso di eccezioni è stato ampliato NullPointerException. Mentre prima il messaggio di errore si riferiva solo al numero di riga, ora specifica quale metodo ha causato l'eccezione. La diagnostica avanzata è attualmente abilitata solo se avviata con il flag "-XX:+ShowCodeDetailsInExceptionMessages". Ad esempio, quando si specifica questo flag, l'eccezione nella riga

    var nome = user.getLocation().getCity().getName();

    risulterà in un messaggio

    Eccezione nel thread "main" java.lang.NullPointerException: impossibile invocare "Location.getCity()"
    perché il valore restituito di "User.getLocation()" è null
    in NullPointerExample.main(NullPointerExample.java:5):5)

    il che rende chiaro che il metodo Location.getCity() non è stato chiamato e User.getLocation() ha restituito null.

  • Implementato Un'anteprima dell'utilità jpackage, che consente di creare pacchetti per applicazioni Java autonome. L'utility è basata su javapackager di JavaFX e consente di creare pacchetti in formati nativi per varie piattaforme (msi ed exe per Windows, pkg e dmg per macOS, deb e rpm per Linux). I pacchetti includono tutte le dipendenze richieste.
  • Al garbage collector G1 aggiunto un nuovo meccanismo di allocazione della memoria che tiene conto delle specificità del lavoro su sistemi di grandi dimensioni utilizzando l'architettura NUMA. Il nuovo allocatore di memoria viene abilitato utilizzando il flag "+XX:+UseNUMA" e può migliorare significativamente le prestazioni sui sistemi NUMA.
  • Aggiunto API per il monitoraggio al volo degli eventi JFR (JDK Flight Recorder), ad esempio per organizzare il monitoraggio continuo.
  • Aggiunto modulo jdk.nio.mapmode, che offre nuove modalità (READ_ONLY_SYNC, WRITE_ONLY_SYNC) per la creazione di buffer di byte mappati (MappedByteBuffer) che fanno riferimento alla memoria non volatile (NVM).
  • Implementato Un'anteprima dell'API Foreign-Memory Access, che consente alle applicazioni Java di accedere in modo sicuro ed efficiente alle regioni di memoria esterne all'heap Java manipolando le nuove astrazioni MemorySegment, MemoryAddress e MemoryLayout.
  • Annunciato port deprecati per il sistema operativo Solaris e i processori SPARC (Solaris/SPARC, Solaris/x64 e Linux/SPARC) con l'intenzione di rimuovere tali port in futuro. La deprecazione di questi port consentirà alla comunità di accelerare lo sviluppo di nuove funzionalità OpenJDK senza perdere tempo nel mantenimento delle funzionalità specifiche di Solaris e SPARC.
  • RIMOSSO il garbage collector CMS (Concurrent Mark Sweep), che è stato contrassegnato come obsoleto due anni fa e non è stato mantenuto (CMS è stato sostituito molto tempo fa dal garbage collector G1). Oltretutto, объявлено deprecato l'uso di una combinazione di algoritmi di garbage collection ParallelScavenge e SerialOld (eseguiti con le opzioni "-XX:+UseParallelGC -XX:-UseParallelOldGC").
  • Il supporto sperimentale per il garbage collector ZGC (Z Garbage Collector) è stato fornito sulle piattaforme macOS e Windows (in precedenza supportato solo su Linux). ZGC funziona in modalità passiva, riduce al minimo la latenza dovuta alla garbage collection (il tempo di stallo quando si utilizza ZGC non supera i 10 ms.) e può funzionare con heap sia piccoli che enormi, di dimensioni variabili da diverse centinaia di megabyte a molti terabyte.
  • RIMOSSO Toolkit e API per la compressione di file JAR utilizzando l'algoritmo Pack200.

Fonte: opennet.ru

Aggiungi un commento