Was sind sealed classes?

v.15Das Prinzip der sealed classes stellt ein Verfahren dar, um Ableitungen von Klassen und Interfaces zu kontrollieren bzw. zu beschränken. Das Schlüsselwort sealed gibt hierbei an, dass eine Klasse oder ein Interface nur durch vorgegebene Typen erweitert werden darf. Bei einem Interface wird darüber hinaus zusätzlich geregelt, welche Klassen das Interface implementieren dürfen. Welche Klassen oder Schnittstellen dies sind, wird durch permits spezifiziert.
Um eine Klasse oder ein Interface als sealed zu deklarieren, wird das Schlüsselwort sealed zu den Klassenmodifizierern hinzugefügt. Nach beliebigen extends- oder implements-Anweisungen muss das Schlüsselwort permits gefolgt von einer Komma-separierten Liste von Klassen- bzw. Interfacebezeichnern notiert werden.

Eine als sealed deklarierte Klasse muss sich mit seinen Unterklassen entweder im gleichen benannten Modul oder, falls in einem unbenannten Modul, im gleichen package befinden.

public sealed class Literatur permits Roman, Gedicht, Sachbuch {}

sealed class Roman extends Literatur permits Krimi, Liebesroman {}

final class Gedicht extends Literatur {}

non-sealed class Sachbuch extends Literatur {}

final class Krimi extends Roman {}

final class Liebesroman extends Roman {}

Die abgeleiteten Klassen müssen ihrerseits durch einen der folgenden Modifizierer gekennzeichnet werden:

sealed wiederum müssen hier Kindklassen durch permits angegeben werden.
non-sealed hier liegen keine Einschränkungen vor.
final eine Ableitung von dieser Klasse ist nicht möglich.

Oracle gibt an, dass die permits-Anweisungen dann entfallen können, wenn die erlaubten Subklassen in der Datei der Elternklasse definiert werden.1 Die Eclipse-Version des Autors (Version: 2022-03 (4.23.0)) wusste hiervon allerdings nichts und verlangte immer eine entsprechende Anweisung.

Quellen
  1. https://docs.oracle.com/en/java/javase/15/language/sealed-classes-and-interfaces.html