5 nieuwe features in Java 17

java

Als Eonics consultant werk je samen met collega’s aan het bijhouden van je kennis. Zo leidt collega Michel ten Voorde momenteel een groepje dat werkt aan de nieuwe OCP certificering. Daarnaast verdiepte hij zich ook in de aankomende Java features en deelt deze graag met collega’s en de Inbox-lezer.

1. Compact number formatting

Met compact number formatting wordt het voortaan mogelijk om automatisch nummers te converteren naar een tekst die voor een bepaald land en taal van toepassing is. Zie het onderstaande voorbeeld:

NumberFormat compactFormatter = NumberFormat.getCompactNumberInstance(
    Locale.US, NumberFormat.Style.LONG);
String result = compactFormatter.format(9000);
System.out.println("It's over " + result + "!!!");
// OUTPUT: “It’s over nine thousand”

Zoals je ziet in het bovenstaande voorbeeld wordt het getal 9000 op deze manier automatisch omgezet in de tekst: “nine thousand”, handig!

2. Behulpzame NullPointerExceptions

Je kent het wel. Je zit vlak voor een deadline de laatste stukken code te debuggen en krijgt de beruchte melding:

Exception in thread "main" java.lang.NullPointerException

Vervolgens is het zoeken geblazen naar welke variabele nou precies de exception heeft veroorzaakt, heel irritant.

Om dit probleem te verhelpen kan Java nu aangeven waar de exceptie precies door komt. Neem bijvoorbeeld deze code:

// c == null
System.out.println(a.b.c.d);

Java zal voortaan duidelijker aangeven wat het probleem is, in dit geval:

Exception in thread "main" java.lang.NullPointerException: 
    Cannot read field "d" because "a.b.c" is null

3. Records

Records zijn niet muteerbare data classes die je eenvoudig kunt definiëren door het simpelweg opgeven van naam en type. Neem bijvoorbeeld:

record Point(int x, int y) {}

Alle andere relevante zaken die je nodig hebt worden vervolgens automatisch gegenereerd door de compiler:

  • corresponderende private final velden
  • de getters (zonder de get-prefix)
  • een zogenaamde canonical  constructor voor alle velden
  • equals, hashCode en toString

Een mooie en handige toevoeging al met al.

4. Pattern matching voor instanceof

Een andere subtiele maar welkome verandering is de verbeterde en verkorte syntax bij het gebruik van instanceof. 

In de oude situatie zou je bijvoorbeeld schrijven:

if (obj instanceof Point) {
    Point p = (Point) obj;
    return x == p.x && y == p.y;
} else {
    return false;
}

Met deze nieuwe feature kan dat korter en leesbaarder:

if (obj instanceof Point p) {
    return x == p.x && y == p.y;
} else {
    return false;
}

Klein maar fijn!

5. Sealed classes

De nieuwe zogenaamde sealed classes en interfaces limiteren welke andere classes of interfaces hen mogen implementeren.

Dit maakt het mogelijk voor een superklasse om wel toegankelijk te blijven, zonder de mogelijkheid te bieden om deze ook te extenden. 

Bijvoorbeeld:

public abstract sealed class Shape
    permits Triangle, Square, Circle {...}

Gepermiteerde subclasses zijn op de volgende wijze gelimiteerd:

  • ze moeten direct de sealed class extenden;
  • ze moeten in dezelfde module of package zitten;
  • ze moeten expliciet aangeven hoe ze de overerfde sealing van hun superklasse doorgeven

Dit klinkt vrij abstract maar met de onderstaande voorbeelden zie je hopelijk beter de achterliggende logica:

public final class Triangle extends Shape {...}
public sealed class Square extends Shape permits Rectangle {...}
public non-sealed class Circle extends Shape {...}

Meer weten en zelf aan de slag?

Bekijk deze presentatie om alle voorbeelden te zien. Aan het einde van de presentatie is ook een link te vinden naar een git repo met oefeningen waarmee je zelf aan de slag kunt.

Op zoek naar nieuwe collega’s om je kennis mee te delen?

Bij Eonics vinden we kennisdeling erg belangrijk. We bieden dan ook volop mogelijkheden om daarmee bezig te zijn. Ook benieuwd of Eonics bij jou past? Laat je gegevens achter in het onderstaande formulier, dan nemen we zo snel mogelijk contact met je op.