Eindelijk is JDK 12, dat deel uitmaakt van de zesmaandelijkse releasecyclus, hier. Het komt na de laatste Java LTS-versie 11. We hadden eerder uitgebreid gediscussieerd over Java 11-functies. Vandaag zullen we de functies van Java 12 bespreken en zien wat het voor ontwikkelaars in petto heeft. Java 12 werd gelanceerd op 19 maart 2019. Het is een Non-LTS-versie. Daarom heeft het geen langetermijnondersteuning.
Java 12-functies
Enkele belangrijke Java 12-functies zijn;
- Wijzigingen in de JVM – JEP 189, JEP 346, JEP 344 en JEP 230.
- Switch Expressions
- Bestandsmismatch() Methode
- Compacte nummeropmaak
- Teeing-collectors in Stream API
- Nieuwe methoden voor Java-strings – indent(), transform(), describeConstable() en resolveConstantDesc().
- JEP 334: JVM Constants API
- JEP 305: Patroonmatching voor instanceof
- Raw String Literals zijn verwijderd uit JDK 12.
Laten we al deze Java 12-functies een voor een bekijken.
Wijzigingen in de JVM
1. JEP 189 – Shenandoah: Een Garbage Collector met Lage Pauzetijd (Experimenteel)
RedHat heeft de Shenandoah Garbage Collector geïntroduceerd om GC-pauzes te verminderen. Het idee is om GC gelijktijdig met de lopende Java-threads uit te voeren. Het streeft naar consistente en voorspelbare korte pauzes, ongeacht de heap-grootte. Dus het maakt niet uit of de heap-grootte 15 MB of 15 GB is. Het is een experimentele functie in Java 12.
2. JEP 346 – Onmiddellijk Ongebruikte Toegewezen Geheugenruimte van G1 Teruggeven
Vanaf Java 12 zal G1 nu de Java Heap-geheugenruimte controleren tijdens inactiviteit van de toepassing en deze teruggeven aan het besturingssysteem. Dit is een preventieve maatregel om vrije geheugenruimte te behouden en te gebruiken.
3. JEP 344: Afbreekbare Gemengde Collecties voor G1
Verbeteringen in de efficiëntie van G1 omvatten het afbreken van gemengde G1-verzamelingen als ze mogelijk de gedefinieerde pauzedoelstelling zouden overschrijden. Dit wordt gedaan door de gemengde verzamelset op te splitsen in verplichte en optionele onderdelen. Op deze manier kan de G1-collector prioriteit geven aan het verzamelen van de verplichte set om aan het doel van de pauzetijd te voldoen.
4. JEP 230 en 344
Microbenchmark Suite, JEP 230-functie voegt een basispakket met microbenchmarks toe aan de JDK-broncode. Dit maakt het voor ontwikkelaars eenvoudig om bestaande microbenchmarks uit te voeren en nieuwe te maken. Eén AArch64-port, geen twee, JEP 344, verwijdert alle bronnen die verband houden met de arm64-poort, met behoud van de 32-bits ARM-poort en de 64-bits aarch64-poort. Dit stelt bijdragers in staat zich te concentreren op een enkele 64-bits ARM-implementatie
5. JEP 341 Default CDS Archives
Dit verbetert het JDK-buildproces om een class data-sharing (CDS) -archief te genereren, met gebruik van de standaardklassenlijst, op 64-bits platforms. Het doel is om de opstarttijd te verbeteren. Vanaf Java 12 staat CDS standaard AAN. Om uw programma uit te voeren met CDS uitgeschakeld, doet u het volgende:
java -Xshare:off HelloWorld.java
Dit zou nu de opstarttijd van het programma vertragen.
Taalwijzigingen en Functies
Java 12 heeft veel taalfuncties geïntroduceerd. Laten we er een paar bekijken met implementaties.
1. Schakel Expressies (Preview)
Java 12 heeft Schakel expressies verbeterd voor Patroonmatching. Geïntroduceerd in JEP 325, als een voorbeeldtaalfunctie, is de nieuwe syntaxis L ->
. Hier zijn enkele dingen om op te merken over Schakel Expressies:
- De nieuwe syntaxis verwijdert de noodzaak voor de break-instructie om door te vallen.
- Schakel Expressies vallen niet meer door.
- Bovendien kunnen we meerdere constanten definiëren in hetzelfde label.
default
case is nu verplicht in Schakel Expressies.break
wordt gebruikt in Schakel Expressies om waarden terug te geven vanuit een case zelf.
Klassieke switch-instructie:
String result = "";
switch (day) {
case "M":
case "W":
case "F": {
result = "MWF";
break;
}
case "T":
case "TH":
case "S": {
result = "TTS";
break;
}
};
System.out.println("Old Switch Result:");
System.out.println(result);
Met de nieuwe Schakel expressie hoeven we niet overal break in te stellen om logische fouten te voorkomen!
String result = switch (day) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(day.isEmpty())
break "Please insert a valid day.";
else
break "Looks like a Sunday.";
}
};
System.out.println(result);
Laten we het onderstaande programma uitvoeren dat de nieuwe Schakel Expressie bevat met behulp van JDK 12.
public class SwitchExpressions {
public static void main(String[] args)
{
System.out.println("New Switch Expression result:");
executeNewSwitchExpression("M");
executeNewSwitchExpression("TH");
executeNewSwitchExpression("");
executeNewSwitchExpression("SUN");
}
public static void executeNewSwitchExpression(String day){
String result = switch (day) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(day.isEmpty())
break "Please insert a valid day.";
else
break "Looks like a Sunday.";
}
};
System.out.println(result);
}
}
Omdat dit een voorbeeldfunctie is, zorg ervoor dat je het taalniveau hebt ingesteld op Java 12-preview. Om de bovenstaande code te compileren, voer je de volgende opdracht uit:
javac -Xlint:preview --enable-preview -source 12 src/main/java/SwitchExpressions.java
Na het uitvoeren van het gecompileerde programma, krijgen we het volgende in de console te zien

Switch-expressies is een voorbeeldtaalfunctie. Dit betekent dat hoewel het volledig is, het mogelijk niet wordt bevestigd in toekomstige Java-releases.
2. Methode File.mismatch
Java 12 voegde de volgende methode toe om twee bestanden te vergelijken:
public static long mismatch(Path path, Path path2) throws IOException
Deze methode geeft de positie van het eerste verschil terug of -1L als er geen verschil is. Twee bestanden kunnen verschillen in de volgende scenario’s:
- Als de bytes niet identiek zijn. In dat geval wordt de positie van het eerste niet-overeenkomende byte teruggegeven.
- Bestandsgroottes zijn niet identiek. In dit geval wordt de grootte van het kleinere bestand teruggegeven.
Voorbeeldcodefragment uit IntelliJ Idea is hieronder gegeven:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class FileMismatchExample {
public static void main(String[] args) throws IOException {
Path filePath1 = Files.createTempFile("file1", ".txt");
Path filePath2 = Files.createTempFile("file2", ".txt");
Files.writeString(filePath1,"JournalDev Test String");
Files.writeString(filePath2,"JournalDev Test String");
long mismatch = Files.mismatch(filePath1, filePath2);
System.out.println("File Mismatch position... It returns -1 if there is no mismatch");
System.out.println("Mismatch position in file1 and file2 is >>>>");
System.out.println(mismatch);
filePath1.toFile().deleteOnExit();
filePath2.toFile().deleteOnExit();
System.out.println();
Path filePath3 = Files.createTempFile("file3", ".txt");
Path filePath4 = Files.createTempFile("file4", ".txt");
Files.writeString(filePath3,"JournalDev Test String");
Files.writeString(filePath4,"JournalDev.com Test String");
long mismatch2 = Files.mismatch(filePath3, filePath4);
System.out.println("Mismatch position in file3 and file4 is >>>>");
System.out.println(mismatch2);
filePath3.toFile().deleteOnExit();
filePath4.toFile().deleteOnExit();
}
}
De uitvoer wanneer het bovenstaande Java-programma wordt gecompileerd en uitgevoerd is:

3. Compacte nummeropmaak
import java.text.NumberFormat;
import java.util.Locale;
public class CompactNumberFormatting {
public static void main(String[] args)
{
System.out.println("Compact Formatting is:");
NumberFormat upvotes = NumberFormat
.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);
upvotes.setMaximumFractionDigits(1);
System.out.println(upvotes.format(2592) + " upvotes");
NumberFormat upvotes2 = NumberFormat
.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);
upvotes2.setMaximumFractionDigits(2);
System.out.println(upvotes2.format(2011) + " upvotes");
}
}

4. Teeing Collectors
Teeing Collector is het nieuwe hulpprogramma voor verzamelaars dat is geïntroduceerd in de Streams API. Deze verzamelaar heeft drie argumenten – Twee verzamelaars en een Bi-function. Alle invoerwaarden worden doorgegeven aan elke verzamelaar en het resultaat is beschikbaar in de Bi-function.
double mean = Stream.of(1, 2, 3, 4, 5)
.collect(Collectors.teeing(
summingDouble(i -> i),
counting(),
(sum, n) -> sum / n));
System.out.println(mean);
De uitvoer is 3.0.
5. Nieuwe methoden voor Java-strings
Er zijn 4 nieuwe methoden geïntroduceerd in Java 12, namelijk:
- inspringen(int n)
- transformeren(Functie f)
- Optioneel beschrijvenConstable()
- String oplossenConstantDesc(MethodHandles.Lookup opzoeken)
Voor meer informatie over de bovenstaande methoden en hun implementatie in detail, raadpleeg onze Java 12 String Methods tutorial.
6. JEP 334: JVM Constants API
A new package java.lang.constant
is introduced with this JEP. This is not that useful for those developers who don’t use constants pool.
7. JEP 305: Patroonovereenkomst voor instanceof (Preview)
Nog een voorproefje van taalfunctionaliteit! De oude manier om een type naar een ander type te casten is:
if (obj instanceof String) {
String s = (String) obj;
// gebruik s in je code vanaf hier
}
De nieuwe manier is:
if (obj instanceof String s) {
// kan s direct hier gebruiken
}
Dit bespaart ons wat onnodige typecasting.
Raw String Literals zijn verwijderd uit JDK 12.
Dat brengt een einde aan dit artikel over Java 12-functies.
Source:
https://www.digitalocean.com/community/tutorials/java-12-features