Java 17 hat versiegelte Klassen eingeführt, die Entwicklern ermöglichen, die zulässigen Unterklassen einer Schnittstelle oder Klasse explizit zu listen. Diese Funktion ermöglicht exhaustive Pattern Matching, wodurch der Compiler sicherstellen kann, dass alle Fälle in einer Switch-Anweisung abgedeckt sind, ohne dass eine Default-Klausel erforderlich ist. Beispielsweise kann eine versiegelte Schnittstelle `SealedType` mit den Unterklassen `TypeA` und `TypeB` in einer Switch-Anweisung verwendet werden, die nur diese beiden Fälle verarbeitet und damit eine Default-Klausel überflüssig macht.
Allerdings stellt dies eine neue Art von zerstörerischer Veränderung dar: Ein neuer Untertyp zu einer versiegelten Klasse kann den Code von Anwendern brechen, wenn dieser nicht neu kompiliert wird. Wenn der Anwender nicht neu kompiliert wird, kann ein Laufzeit-Exception (z. B. `MatchException`) auftreten, wenn der neue Fall ausgelöst wird. Dies ist besonders problematisch, wenn versiegelte Klassen in öffentlichen APIs freigegeben werden, da separate Kompilierung zu nicht erkannten Fehlern führen kann.
Versiegelte Klassen sind besonders nützlich in der Implementierung eines einzelnen Komponenten, wo der gesamte Code zusammen neu kompiliert wird. Wenn sie zwischen Modulgrenzen verwendet werden, können sie neue Möglichkeiten zur Beschädigung des Codes einführen, die erst zur Laufzeit erkannt werden. Entwickler sollten sorgfältig prüfen, ob versiegelte Klassen für öffentliche APIs geeignet sind.
Quelle: Hacker News · Zusammengefasst von HeadlinesBriefing