Non ci siamo ancora completamente immerse in Java 10, e Java 11 è qui. Java 11 è importante per più di qualche motivo. Oracle ha rivoluzionato il suo modello di supporto e ha introdotto un treno di rilascio che porterà aggiornamenti rapidi, circa ogni 6 mesi. Hanno cambiato il modello di licenza e supporto, il che significa che se scarichi il JDK di Java 11 Oracle, dovrai pagare per un uso commerciale.
Questo significa che devo pagare per Java da adesso in poi? NO. Non necessariamente, a meno che tu non scarichi l’Oracle JDK e lo utilizzi in produzione.
Nota: IntelliJ IDEA 2018.2.4 Community Edition ha già il supporto per Java 11.
1. Perché Java 11 è importante?
Java 11 è il secondo rilascio LTS dopo Java 8. Dal Java 11, l’Oracle JDK non sarà più gratuito per un uso commerciale. Puoi usarlo nello sviluppo, ma per usarlo commercialmente devi acquistare una licenza. Se non lo fai, potresti ricevere una fattura da Oracle in qualsiasi momento! Java 10 è stato l’ultimo Oracle JDK gratuito che poteva essere scaricato. Oracle ha interrotto il supporto per Java 8 a partire da gennaio 2019. Dovrai pagare per ulteriori supporti. Puoi continuare a usarlo, ma non riceverai più patch/aggiornamenti di sicurezza.
Oracle non fornirà più supporto a lungo termine (LTS) gratuito per nessuna versione di Java singola a partire da Java 11.
Mentre Oracle JDK non è più gratuito, puoi sempre scaricare le versioni Open JDK da Oracle o da altri fornitori come AdoptOpenJDK, Azul, IBM, Red Hat, ecc. Secondo me, a meno che tu non stia cercando un utilizzo di livello Enterprise con la voglia di pagare le tariffe di supporto, puoi utilizzare OpenJDK e aggiornarle quando necessario.
2. Quale build JDK dovrei scaricare e quali sono i vantaggi di ciascuna di esse?
Dato che Oracle ha creato un treno di rilascio in cui una nuova versione sarebbe stata pubblicata ogni sei mesi, se stai utilizzando l’Open JDK gratuito di Oracle, dovrai aggiornarlo ogni sei mesi, poiché Oracle non fornirà aggiornamenti gratuiti una volta che la nuova versione è rilasciata. Questo può essere difficile da adattare a un’azienda. Paga il supporto commerciale ad Oracle e migrare solo dalla versione LTS successiva alla successiva. In questo modo otterrai tutti gli aggiornamenti e il supporto per Java 11 fino al 2026. Puoi scaricare Java 17 nel 2022. Rimanere sulla versione Java gratuita anche dopo la fine del supporto. Anche se non riceverai aggiornamenti di sicurezza e potrebbe aprirsi a falle di sicurezza.
Oracle non fornirà supporto commerciale o aggiornamenti per Java 9 e Java 10. È necessario cercare altre build alternative per continuare a utilizzarle gratuitamente.
Aver compreso il bagaglio con cui arriva Java 11, analizziamo ora le caratteristiche importanti in Java 11 per gli sviluppatori. Discuteremo anche alcuni importanti JEP. Nota: JavaFX sarà disponibile come modulo separato e non legato al ciclo di rilascio semestrale di Java JDK.
3. Come scaricare la versione gratuita di Java 11?
È possibile scaricare la versione OpenJDK pronta per la produzione da questo link. Gli eseguibili sono in formato tar o zip, quindi basta decomprimerli e impostare le variabili d’ambiente per utilizzare il compilatore Java e i comandi Java.
4. Caratteristiche di Java 11
Alcune delle caratteristiche importanti di Java 11 sono:
- Esecuzione del file Java con un singolo comando
- Nuovi metodi di utilità nella classe String
- Sintassi di variabile locale per i parametri Lambda
- Controllo degli accessi basato su nidificazione
- JEP 321: Client HTTP
- Lettura/Scrittura di stringhe da e verso i file
- JEP 328: Registratore di volo
Discutiamo delle nuove caratteristiche introdotte con Java 11 dal Processo JEP.
4.1) Esecuzione del file Java con un singolo comando
Una modifica importante è che non è necessario compilare prima il file sorgente Java con lo strumento javac
. È possibile eseguire direttamente il file con il comando java e viene compilato implicitamente. Questa funzionalità rientra nel JEP 330. Di seguito è uno sguardo alle nuove metodologie della classe Java String introdotte in Java 11:
4.2) Metodi di String Java
isBlank() – Questo metodo di istanza restituisce un valore booleano. Le stringhe vuote e le stringhe con solo spazi bianchi vengono considerate vuote.
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// Il tuo codice qui!
System.out.println(" ".isBlank()); //true
String s = "Anupam";
System.out.println(s.isBlank()); //false
String s1 = "";
System.out.println(s1.isBlank()); //true
}
}
lines() Questo metodo restituisce uno stream di stringhe, che è una raccolta di tutte le sottostringhe divise per righe.
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws Exception {
String str = "JD\nJD\nJD";
System.out.println(str);
System.out.println(str.lines().collect(Collectors.toList()));
}
}
L’output del codice sopra è: strip(), stripLeading(), stripTrailing()
strip()
– Rimuove gli spazi bianchi sia dall’inizio che dalla fine della stringa.
Ma già abbiamo trim(). Allora qual è la necessità di strip()? strip()
è l’evoluzione “Unicode-aware” di trim()
. Quando è stato introdotto trim()
, Unicode non era evoluto. Ora, il nuovo strip() rimuove tutti i tipi di spazi bianchi iniziali e finali (controlla il metodo Character.isWhitespace(c)
per sapere se un unicode è uno spazio bianco o no)
Un esempio che utilizza i tre metodi sopra è riportato di seguito:
public class Main {
public static void main(String[] args) throws Exception {
// Il tuo codice qui!
String str = " JD ";
System.out.print("Start");
System.out.print(str.strip());
System.out.println("End");
System.out.print("Start");
System.out.print(str.stripLeading());
System.out.println("End");
System.out.print("Start");
System.out.print(str.stripTrailing());
System.out.println("End");
}
}
L’output nella console dal codice sopra è: repeat(int) Il metodo repeat semplicemente ripete la stringa quel numero di volte come specificato nel metodo sotto forma di un int.
public class Main {
public static void main(String[] args) throws Exception {
// Il tuo codice qui!
String str = "=".repeat(2);
System.out.println(str); //prints ==
}
}
4.3) Sintassi della variabile locale per i parametri Lambda
JEP 323, la Sintassi di Variabile Locale per i Parametri Lambda è l’unica nuova funzionalità del linguaggio rilasciata in Java 11. In Java 10 è stata introdotta la Inferenza del Tipo di Variabile Locale. Pertanto, potevamo dedurre il tipo della variabile dalla parte destra – var lista = new ArrayList<String>();
JEP 323 consente l’uso di var
per dichiarare i parametri formali di un’espressione lambda di tipo implicito. Ora possiamo definire :
(var s1, var s2) -> s1 + s2
Questo era possibile anche in Java 8 ma è stato rimosso in Java 10. Ora è tornato in Java 11 per mantenere le cose uniformi. Ma perché è necessario quando possiamo semplicemente omettere il tipo nella lambda? Se è necessario applicare un’annotazione come @Nullable, non è possibile farlo senza definire il tipo. Limitazione di questa funzionalità – È necessario specificare il tipo var su tutti i parametri o su nessuno. Cose come le seguenti non sono possibili:
(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed
var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.
4.4) Controllo Accesso Basato su Struttura Anidato
Prima di Java 11 questo era possibile:
public class Main {
public void myPublic() {
}
private void myPrivate() {
}
class Nested {
public void nestedPublic() {
myPrivate();
}
}
}
Il metodo privato della classe principale è accessibile dalla classe annidata superiore in questo modo. Ma se usiamo Java Reflection, verrà restituito un IllegalStateException
.
Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);
Il controllo degli accessi nidificati di Java 11 affronta questa preoccupazione nella riflessione. La classe java.lang.Class
introduce tre metodi nell’API di riflessione: getNestHost()
, getNestMembers()
e isNestmateOf()
.
4.5) JEP 309: Costanti di File di Classe Dinamiche
Il formato del file di classe Java ora estende il supporto a una nuova forma di pool costanti, CONSTANT_Dynamic. Lo scopo di questa JEP è ridurre il costo e il disagio dello sviluppo di nuove forme di vincoli di file di classe materializzabili, creando una singola nuova forma di pool costanti che può essere parametrizzata con comportamenti forniti dall’utente. Questo migliora le prestazioni
4.6) JEP 318: Epsilon: Un Garbage Collector No-Op
A differenza del GC di JVM, che è responsabile dell’allocazione e della liberazione della memoria, Epsilon allocata solo memoria. Alloca memoria per le seguenti cose:
- Test di prestazioni.
- Test di pressione della memoria.
- Test dell’interfaccia VM.
- Lavori estremamente brevi.
- Miglioramenti della latenza dell’ultima goccia.
- Miglioramenti dell’ultimo calo della capacità.
Ora Elipson è buono solo per ambienti di test. Porterà a OutOfMemoryError in produzione e farà crashare le applicazioni. Il vantaggio di Elipson è l’assenza di overhead di pulizia della memoria. Pertanto, darà un risultato di test accurato delle prestazioni e non possiamo più eseguire GC per fermarlo. Nota: Questa è una funzionalità sperimentale.
4.7) JEP 320: Rimozione dei Moduli Java EE e CORBA
I moduli erano già deprecati in Java 9. Ora sono completamente rimossi. Sono stati rimossi i seguenti pacchetti: java.xml.ws
, java.xml.bind
, java.activation
, java.xml.ws.annotation
, java.corba
, java.transaction
, java.se.ee
, jdk.xml.ws
, jdk.xml.bind
4.8) JEP 328: Registratore di Volo
Il Flight Recorder, che in precedenza era un componente aggiuntivo commerciale in Oracle JDK, è ora open source poiché Oracle JDK non è più gratuito. JFR è uno strumento di profilazione utilizzato per raccogliere dati diagnostici e di profilazione da un’applicazione Java in esecuzione. Il suo overhead prestazionale è trascurabile e di solito è inferiore all’1%. Di conseguenza, può essere utilizzato in applicazioni di produzione.
4.9) JEP 321: Client HTTP
Java 11 standardizza l’API del client HTTP. La nuova API supporta sia HTTP/1.1 che HTTP/2. È progettata per migliorare le prestazioni complessive dell’invio di richieste da parte di un client e della ricezione di risposte dal server. Supporta anche nativamente i WebSockets.
4.10) Lettura/Scrittura di Stringhe da e verso i File
Java 11 si impegna a rendere più comoda la lettura e la scrittura di Stringhe. Ha introdotto i seguenti metodi per la lettura e la scrittura da/per i file:
- readString()
- writeString()
Il seguente codice mostra un esempio di questo.
Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on JD
4.11) JEP 329: Algoritmi crittografici ChaCha20 e Poly1305
Java 11 fornisce implementazioni dei cifrari ChaCha20 e ChaCha20-Poly1305. Questi algoritmi saranno implementati nel provider SunJCE.
4.12) JEP 315: Migliorare gli intrinseci Aarch64
Migliorare gli intrinseci delle stringhe e degli array esistenti e implementare nuovi intrinseci per le funzioni sin, cos e log di java.lang.Math, sui processori AArch64.
4.13) JEP 333: ZGC: Un Garbage Collector Scalabile a Bassa Latenza (Sperimentale)
Java 11 ha introdotto un GC a bassa latenza. Si tratta di una funzionalità sperimentale. È positivo vedere che Oracle sta dando importanza ai GC.
4.14) JEP 335: Deprecare il motore JavaScript Nashorn
Il motore di script JavaScript Nashorn e le API sono deprecati, indicando quindi che saranno rimossi nelle versioni successive.
5. Conclusione
Siamo passati attraverso le caratteristiche e gli aggiornamenti importanti forniti in Java 11. Ci vediamo presto con il rilascio di Java 12.
Source:
https://www.digitalocean.com/community/tutorials/java-11-features