Nuove funzionalità di Java 10

Questo articolo fa parte di una serie:? Java 10 LocalVariable Type-Inference

• Miglioramenti delle prestazioni di Java 10

• Nuove funzionalità di Java 10 (articolo attuale)

1. Introduzione

JDK 10, un'implementazione di Java SE 10, è stato rilasciato il 20 marzo 2018.

In questo articolo, tratteremo ed esploreremo le nuove funzionalità e le modifiche introdotte in JDK 10.

2. Inferenza del tipo di variabile locale

Segui il link per un articolo approfondito su questa funzione:

Inferenza del tipo di variabile locale Java 10

3. Collezioni non modificabili

Ci sono un paio di modifiche relative alle raccolte non modificabili in Java 10.

3.1. copia di()

java.util.List , java.util.Map e java.util.Set hanno ciascuno un nuovo metodo statico copyOf (Collection) .

Restituisce la copia non modificabile della raccolta data :

@Test(expected = UnsupportedOperationException.class) public void whenModifyCopyOfList_thenThrowsException() { List copyList = List.copyOf(someIntList); copyList.add(4); }

Qualsiasi tentativo di modificare tale raccolta comporterebbe un'eccezione di runtime java.lang.UnsupportedOperationException .

3.2. toUnmodifiable * ()

java.util.stream.Collectors ottiene metodi aggiuntivi per raccogliere un flusso in un elenco , una mappa o un insieme non modificabili :

@Test(expected = UnsupportedOperationException.class) public void whenModifyToUnmodifiableList_thenThrowsException() { List evenList = someIntList.stream() .filter(i -> i % 2 == 0) .collect(Collectors.toUnmodifiableList()); evenList.add(4); }

Qualsiasi tentativo di modificare tale raccolta comporterebbe un'eccezione di runtime java.lang.UnsupportedOperationException .

4. Facoltativo * .orElseThrow ()

java.util.Optional , java.util.OptionalDouble , java.util.OptionalInt e java.util.OptionalLong hanno ciascuno un nuovo metodo oElseThrow () che non accetta alcun argomento e genera NoSuchElementException se non è presente alcun valore:

@Test public void whenListContainsInteger_OrElseThrowReturnsInteger() { Integer firstEven = someIntList.stream() .filter(i -> i % 2 == 0) .findFirst() .orElseThrow(); is(firstEven).equals(Integer.valueOf(2)); }

È sinonimo di ed è ora l'alternativa preferita al metodo get () esistente .

5. Miglioramenti delle prestazioni

Segui il link per un articolo approfondito su questa funzione:

Miglioramenti delle prestazioni di Java 10

6. Consapevolezza del contenitore

Le JVM ora sono consapevoli di essere eseguite in un contenitore Docker ed estrarranno la configurazione specifica del contenitore invece di interrogare il sistema operativo stesso: si applica a dati come il numero di CPU e la memoria totale che sono stati allocati al contenitore.

Tuttavia, questo supporto è disponibile solo per piattaforme basate su Linux. Questo nuovo supporto è abilitato per impostazione predefinita e può essere disabilitato nella riga di comando con l'opzione JVM:

-XX:-UseContainerSupport

Inoltre, questa modifica aggiunge un'opzione JVM che fornisce la possibilità di specificare il numero di CPU che la JVM utilizzerà:

-XX:ActiveProcessorCount=count

Inoltre, sono state aggiunte tre nuove opzioni JVM per consentire agli utenti del container Docker di ottenere un controllo più dettagliato sulla quantità di memoria di sistema che verrà utilizzata per Java Heap:

-XX:InitialRAMPercentage -XX:MaxRAMPercentage -XX:MinRAMPercentage

7. Certificati radice

The cacerts keystore, which was initially empty so far, is intended to contain a set of root certificates that can be used to establish trust in the certificate chains used by various security protocols.

As a result, critical security components such as TLS didn't work by default under OpenJDK builds.

With Java 10, Oracle has open-sourced the root certificates in Oracle's Java SE Root CA program in order to make OpenJDK builds more attractive to developers and to reduce the differences between those builds and Oracle JDK builds.

8. Deprecations and Removals

8.1. Command Line Options and Tools

Tool javah has been removed from Java 10 which generated C headers and source files which were required to implement native methods – now, javac -h can be used instead.

policytool was the UI based tool for policy file creation and management. This has now been removed. The user can use simple text editor for performing this operation.

Removed java -Xprofoption. The option was used to profile the running program and send profiling data to standard output. The user should now use jmap tool instead.

8.2. APIs

Deprecated java.security.acl package has been marked forRemoval=true and is subject to removal in a future version of Java SE. It's been replaced by java.security.Policy and related classes.

Similarly, java.security.{Certificate,Identity,IdentityScope,Signer} APIs are marked forRemoval=true.

9. Time-Based Release Versioning

Starting with Java 10, Oracle has moved to the time-based release of Java. This has following implications:

  1. A new Java release every six months. The March 2018 release is JDK 10, the September 2018 release is JDK 11, and so forth. These are called feature releases and are expected to contain at least one or two significant features
  2. Support for the feature release will last only for six months, i.e., until next feature release
  3. Long-term support release will be marked as LTS. Support for such release will be for three years
  4. Java 11 will be an LTS release

java -version will now contain the GA date, making it easier to identify how old the release is:

$ 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. Conclusion

In this article, we saw the new features and changes brought in by Java 10.

Come al solito, gli snippet di codice possono essere trovati su GitHub.

« Precedenti miglioramenti delle prestazioni di Java 10