In navolging van de traditie van de zesmaandelijkse cyclus, na de release van Java 13 op 17 september 2019, staat Java 14, nog een niet-LTS-versie, gepland om uit te komen op 17 maart 2020.
Java 14 Functies
Hier is de lijst met Java 14 functies:
- Switch Expressions (Standaard) – JEP 361
- Pattern Matching voor instanceof (Preview) – JEP 305
- Behulpzame NullPointerExceptions – JEP 358
- Records (Preview) – JEP 359
- Text Blocks (Tweede Preview) – JEP 368
- Packaging Tool (Incubator) – JEP 343
- NUMA-Aware Memory Allocation voor G1 – JEP 345
- JFR Event Streaming – JEP 349
- Non-Volatile Mapped Byte Buffers – JEP 352
- ZGC op macOS – JEP 364
- ZGC op Windows – JEP 365
- Foreign-Memory Access API (Incubator) – JEP 370
Java 14 Installatie Setup op Mac OS
- Om aan de slag te gaan met Java 14, download de JDK vanaf hier.
- Kopieer en pak het tar-bestand uit in de map
/Library/Java/JavaVirtualMachines
, zoals hieronder weergegeven:
$ cd /Library/Java/JavaVirtualMachines
$ sudo cp ~/Downloads/openjdk-14_osx-x64_bin.tar.gz /Library/Java/JavaVirtualMachines
$ sudo tar xzf openjdk-14_osx-x64_bin.tar.gz
$ sudo rm openjdk-14_osx-x64_bin.tar.gz
Zodra dat is gedaan, open het bestand bash_profile
met behulp van een teksteditor. Ik gebruik vim ~/.bash_profile
. Stel het pad van Java 14 in als JAVA_HOME, sla de wijzigingen op en voer source ~/.bash_profile
uit om de wijzigingen door te voeren.
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home
Tenslotte ben je klaar om programma’s te compileren en uit te voeren met Java 14. We zullen JShell gebruiken, een interactieve REPL-opdrachtregeltool om snel de nieuwe functies van Java 14 te testen.
Het is belangrijk op te merken dat veel functies die zijn uitgebracht in Java 14 zich in de previewfase bevinden. Dit betekent dat hoewel ze momenteel volledig functioneel zijn, dingen in de toekomst kunnen worden aangepast. Sommige functies kunnen standaard worden gemaakt of eenvoudig worden verwijderd in de volgende release-cycli. Om previewfuncties te testen, moet je expliciet --enable-preview
instellen bij het uitvoeren van JShell of een Java-programma, zoals hieronder weergegeven:
jshell --enable-preview
javac --release 14 --enable-preview Author.java
In de volgende secties bespreken we enkele van de taal- en JVM-functies.
Aanbevolen Lectuur: Java 14 installeren op Linux
1. Switch Expressions
Switch Expressies, die na een preview-functie te zijn geweest in de laatste twee releases – Java 12 en Java 13 hebben eindelijk een permanente status bereikt in Java 14.
- Java 12 introduceerde de lambda-syntaxis voor switch expressies, waardoor meerdere case-labels mogelijk zijn voor patroonmatching en het voorkomen van doorvallen die leiden tot uitgebreide code. Het dwong ook tot volledige cases, waarbij een compilatiefout zou optreden als niet alle invoercases waren gedekt.
- Java 13, de tweede preview, introduceerde
yield
-verklaringen in plaats vanbreak
om waarden terug te geven vanuit een expressie.
Java 14 heeft deze functies nu eindelijk gestandaardiseerd.
String result = switch (day) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(day.isEmpty())
yield "Please insert a valid day.";
else
yield "Looks like a Sunday.";
}
};
System.out.println(result);

Opmerking: Yield is geen nieuw trefwoord in Java. Het wordt alleen gebruikt in switch expressies.
2. Patroonmatching voor instanceof (Preview)
Vraag elke Java-ontwikkelaar om hun codebase te tonen en je zult veel gebruik zien van instanceof
-voorwaarden in de hele code. Specifiek wordt een voorwaardelijke instanceof-controle doorgaans gevolgd door een typecasting.
Java 14 maakt deze omslachtigheid overbodig door voorwaardelijke extractie veel beknopter te maken.
Voor Java 14:
if (obj instanceof Journaldev) {
Journaldev jd = (Journaldev) obj;
System.out.println(jd.getAuthor());
}
Java 14 en verder:
if (obj instanceof Journaldev jd) {
System.out.println(jd.getAuthor());
}
In de bovenstaande code wordt de instantie jd
alleen toegewezen als obj
van het type Journaldev
is. De reikwijdte van de variabele is beperkt tot het conditionele blok alleen.
3. Behulpzame NullPointerExceptions
Null Pointer Exceptions zijn een nachtmerrie voor elke ontwikkelaar. Voorheen, tot Java 13, was het lastig om de beruchte NPE’s te debuggen. Ontwikkelaars moesten terugvallen op andere debugtools of handmatig de variabele/methode vinden die nul was, omdat de stacktrace alleen het regelnummer zou tonen.
Voor Java 14:
String name = jd.getBlog().getAuthor()
//Stacktrace
Exception in thread "main" java.lang.NullPointerException
at NullPointerExample.main(NullPointerExample.java:5)
Java 14 introduceerde een nieuwe JVM-functie die betere inzichten geeft met een meer beschrijvende stack zoals hieronder getoond:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Blog.getAuthor()" because the return value of "Journaldev.getBlog()" is null
at NullPointerExample.main(NullPointerExample.java:4)
Opmerking: De bovenstaande functie is geen taalfunctie. Het is een verbetering in de runtime-omgeving.
4. Records (Voorbeeld)
A record is a data class that stores pure data. The idea behind introducing records is to quickly create simple and concise classes devoid of boilerplate code.
Normaal gesproken zou een klasse in Java vereisen dat je equals()
, hashCode()
implementeert, de getters en setters methoden. Hoewel sommige IDE’s de automatische generatie van dergelijke klassen ondersteunen, is de code nog steeds uitgebreid. Met een record
hoef je alleen een klasse op de volgende manier te definiëren.
record Author(){}
//or
record Author (String name, String topic) {}
De Java-compiler zal automatisch een constructor, private final-velden, toegangsmethoden, equals
/hashCode
en toString
-methoden genereren. De automatisch gegenereerde getter-methoden van de bovenstaande klasse zijn name()
en topic()
.
Om de gegenereerde code te bekijken, gebruikt u javap Author
nadat u het programma hebt gecompileerd met javac
. De volgende illustratie toont de gegenereerde klasse voor record Author (String name, String topic) {}
:

De semantiek van Records is vergelijkbaar met Dataklassen in Kotlin
Bovendien kunnen we aanvullende velden, methoden en een constructor aan de record toevoegen op de volgende manier:
record Author (int id, String name, String topic) {
static int followers;
public static String followerCount() {
return "Followers are "+ followers;
}
public String description(){
return "Author "+ name + " writes on "+ topic;
}
public Author{
if (id < 0) {
throw new IllegalArgumentException( "id must be greater than 0.");
}
}
}
De aanvullende constructor gedefinieerd binnen de record wordt een Compact constructor genoemd. Het bestaat niet uit parameters en is slechts een uitbreiding van de canonieke constructor.
A compact constructor wouldn’t be generated as a separate constructor by the compiler. Instead, it is used for validation cases and would be invoked at the start of the main constructor.
Enkele belangrijke punten om op te merken over Records:
- A record can neither extend a class nor it can be extended by another class. It’s a final class.
- Records kunnen niet abstract zijn
- Records kunnen geen andere klasse uitbreiden en kunnen geen instantievelden definiëren binnen het lichaam. Instantievelden moeten alleen worden gedefinieerd in de statusbeschrijving
- Gedeclareerde velden zijn privé en final
- Het lichaam van een record staat statische velden en methoden toe
Aanbevolen literatuur: Java Records
4.1) Waarden binnen referentievelden van een record kunnen worden gemuteerd
Het is belangrijk op te merken dat voor velden die zijn gedefinieerd als objecten, alleen de referentie onveranderlijk is. De onderliggende waarden kunnen worden gewijzigd. De volgende illustratie toont een record waarin de ArrayList wordt gewijzigd. Zoals je kunt zien, wordt de waarde gewijzigd wanneer de ArrayList wordt veranderd.

4.2) Records kunnen interfaces implementeren
Het volgende voorbeeld toont code voor het implementeren van een interface met records:
record Author(String name, String topic) implements Information {
public String getFullName() {
return "Author "+ name + " writes on " + topic;
}
}
interface Information {
String getFullName();
}
Hier is de uitvoer van de bovenstaande code in actie in een JShell:

4.3) Records ondersteunen meerdere constructoren
Records maken het mogelijk om meerdere constructoren te declareren, met of zonder parameters, zoals hieronder wordt getoond:
record Author(String name, String topic) {
public Author() {
this("NA", "NA");
}
public Author(String name) {
this(name, "NA");
}
}
4.4) Records toestaan het wijzigen van toegangsmethoden
Hoewel records openbare toegangsmethoden genereren voor de velden gedefinieerd in de toestandsbeschrijving, staan ze ook toe dat je de toegangsmethoden opnieuw definieert in de body zoals hieronder getoond:
record Author(String name, String topic) {
public String name() {
return "This article was written by " + this.name;
}
}
4.5) Record en de Componenten ervan controleren tijdens runtime
Records bieden ons isRecord()
en getRecordComponents()
om te controleren of de klasse een record is en ook in de velden en types ervan te kijken. De volgende illustratie toont hoe dit wordt gedaan:

Hoewel we in de bovenstaande voorbeelden van code extra velden en methoden aan het record hebben toegevoegd, zorg ervoor dat je dit niet te veel doet. Records zijn ontworpen als eenvoudige gegevensdragers en als je veel extra methoden wilt implementeren, is het beter terug te vallen op de normale klasse.
5. Tekstblokken (Voorbeeld)
Textblokken werden geïntroduceerd als een preview-functie in Java 13 met als doel het eenvoudig maken van multiline string literals. Het is handig voor het eenvoudig maken van HTML- en JSON- of SQL-querystrings.
In Java 14 zijn Textblokken nog steeds in preview met enkele nieuwe toevoegingen. We kunnen nu gebruik maken van:
- Backslash om mooi uitziende multiline stringblokken weer te geven.
\s
wordt gebruikt om rekening te houden met spaties aan het einde die standaard door de compiler worden genegeerd. Het behoudt alle spaties die ervoor aanwezig zijn.
String text = """
Did you know \
Java 14 \
has the most features among\
all non-LTS versions so far\
""";
String text2 = """
line1
line2 \s
line3
""";
String text3 = "line1\nline2 \nline3\n"
//tekst2 en tekst3 zijn gelijk.
Referenties: OpenJDK 14
Source:
https://www.digitalocean.com/community/tutorials/java-14-features