Heim  >  Artikel  >  Java  >  Versiegelte Klassen in Java

Versiegelte Klassen in Java

Susan Sarandon
Susan SarandonOriginal
2024-10-29 01:37:29655Durchsuche

Sealed Classes en Java

versiegelte Klassen sind eine Funktion, die zuvor in JDK 15 und offiziell in JDK 17 eingeführt wurde. Eine versiegelte Klasse ist eine Klasse, die dies nicht kann um Klassen erweitert werden, die nicht explizit erlaubt sind (in der Klassendeklaration), daher ist die Anzahl der Unterklassen begrenzt und im Voraus bekannt.

Sie sollen eine genauere Kontrolle über die Vererbungshierarchie ermöglichen, die Modellierung von Domänen erleichtern, in denen alle möglichen Unterklassen bekannt sind, und die Sicherheit und Wartbarkeit des Codes verbessern.

Der Unterschied zwischen einer versiegelten Klasse und einer Klasse des endgültigen Typs besteht darin, dass letztere um keine Klasse erweitert werden kann, während eine versiegelte Klasse um eine begrenzte Anzahl erweitert werden kann von Klassen.

Deklaration einer versiegelten Klasse

Angenommen, wir haben zwei Klassen, eine Shape-Klasse und eine Circle-Klasse. Beide sind normale Klassen, sodass Shape um jede Klasse erweitert werden kann.

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

Wenn wir das Schlüsselwort final in der Shape-Klasse verwenden, kann es durch keine Klasse erweitert werden.

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

Wenn wir nun möchten, dass die Shape-Klasse nur um bestimmte Klassen erweitert wird (z. B. Circle und Square), können wir sie als versiegelte Klasse deklarieren.

public sealed class Shape permits Circle, Square {
    // ...
}

Bei der Analyse der vorherigen Deklaration sehen wir, dass es notwendig ist, „sealed“ vor dem Wort „class“ zu platzieren, um anzuzeigen, dass es sich um eine sealed class handelt. Anschließend wird das Wort „permits“ verwendet, gefolgt von einer Liste von Klassen, die die aktuelle Klasse erweitern können. Im obigen Beispiel können nur die Klassen „Circle“ und „Square“ die Klasse „Shape“ erweitern.

Das Gleiche passiert, wenn Sie mit einer Klasse vom abstrakten Typ arbeiten, also einer Klasse, die nicht instanziiert werden kann, die aber durch andere Klassen erweitert werden kann.

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

Dieses Konzept kann auch auf Schnittstellen angewendet werden.

public sealed interface Shape permits Circle, Square {
    // ...
}

Hinweis: Zulässige Unterklassen müssen innerhalb desselben Moduls oder Pakets wie die versiegelte-Klasse liegen, andernfalls wird eine Fehlermeldung angezeigt.

Erlaubte Klassen

Sobald eine Klasse als versiegelt deklariert wurde und die zulässigen Klassen angegeben wurden, zeigt die IDE beim Erweitern der Shape-Klasse um eine zulässige Klasse (durch Platzieren von „extends Shape“) eine Fehlermeldung ähnlich dieser an Modifikator „versiegelt“ , „nicht versiegelt“ oder „endgültig“ erwartet, Was bedeutet das?.

Es ist zu beachten, dass jede der erlaubten Klassen (Unterklassen) mit einem der folgenden Schlüsselwörter deklariert werden muss:

  • final: Zeigt an, dass die Klasse nicht erweitert werden kann.
  • versiegelt: Zeigt an, dass die Klasse eine versiegelte Klasse ist und Unterklassen zugelassen hat.
  • nicht versiegelt: Zeigt an, dass die Klasse keine versiegelte Klasse ist und dass sie um jede Klasse erweitert werden kann.

Um das oben Gesagte in die Praxis umzusetzen, arbeiten wir mit der Shape-Klasse und den Klassen Circle, Square und Triangle, um zu sehen, wie die zulässigen Klassen gemäß dem oben Erwähnten deklariert werden können.

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

Zirkelklasse – Abschluss

Wenn wir möchten, dass die Circle-Klasse vom endgültigen Typ ist und daher nicht erweitert werden kann, muss sie wie folgt deklariert werden:

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

Dadurch wird verhindert, dass die Circle-Klasse durch eine andere Klasse erweitert wird.

Quadratische Klasse - versiegelt

Wenn wir möchten, dass die Square-Klasse vom Typ „sealed“ ist und Unterklassen zugelassen haben, die sie erweitern können, muss sie wie folgt deklariert werden:

public sealed class Shape permits Circle, Square {
    // ...
}

In diesem Beispiel wird jede der zulässigen Klassen (SquareChild1 und SquareChild2) vom Typ final deklariert, sodass sie nicht durch eine andere Klasse erweitert werden kann.

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

Wenn Sie möchten, dass diese Klassen um weitere Klassen erweitert werden können, dann sollten sie als versiegelt deklariert werden oder dass sie um jede Klasse mit nicht versiegelten erweitert werden können.

Dreiecksklasse – nicht versiegelt

Wenn die Triangle-Klasse als nicht versiegelt deklariert wird, kann diese Klasse durch jede andere Klasse erweitert werden, ohne dass die zulässigen Klassen angegeben werden müssen.

public sealed interface Shape permits Circle, Square {
    // ...
}

Wenn Sie beispielsweise die TriangleChild-Klasse erstellen, die Triangle erweitert, wird keine Fehlermeldung angezeigt.

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

An dieser Stelle ist es wichtig zu bedenken, dass Sie, wenn Sie eine Klasse als nicht versiegelt deklarieren, in gewisser Weise den Zweck der versiegelten Klassen „brechen“, da sie Ermöglicht die Erweiterung dieser Klasse durch jede andere Klasse und die Anzahl der zulässigen Unterklassen ist nicht begrenzt.

Kann ein Datensatz eine versiegelte Klasse sein?

Ein

Datensatzseinerseits kann nicht vom versiegelten Typ sein, da er bereits vom endgültigen Typ ist und nicht durch eine andere Klasse erweitert werden kann. Sie können jedoch einen Datensatz als zulässig in einer Schnittstelle des versiegelten Typs deklarieren (bedenken Sie, dass ein Datensatz keine Klasse erweitern, sondern nur Schnittstellen implementieren kann). Wenn Sie beispielsweise über einen Datensatz namens „Rectangle“ und eine Shape-Schnittstelle vom Typ „sealed“ verfügen, können Sie „Rectangle“ in der „Shape“-Schnittstelle als zulässig deklarieren. Auf diese Weise kann „Rectangle“ die „Shape“-Schnittstelle und alle in dieser Schnittstelle enthaltenen Methoden implementieren.

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

Was ist mit inneren Klassen?

Wenn eine als versiegelt deklarierte Klasse innere Klassen (verschachtelte oder innere Klassen) hat, wird davon ausgegangen, dass diese Klassen zur Hauptklasse gehören und es daher nicht notwendig ist, sie als zulässig zu deklarieren. Wenn Sie beispielsweise die Klasse „Animal“ als versiegelt deklariert haben und gleichzeitig „Hund“ und „Katze“ als interne Klassen haben, müssen diese Klassen nicht als zulässig deklariert werden, sondern müssen die Hauptklasse erweitern und vom endgültigen Typ sein , versiegelt oder nicht versiegelt.

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

Schlussfolgerungen

Die versiegelten Klassen sind eine Möglichkeit, eine Klassenhierarchie auf eine endliche Anzahl zulässiger Unterklassen zu beschränken, obwohl wir gesehen haben, dass der Zweck etwas verloren geht, wenn eine Klasse als nicht versiegelt deklariert wird Unterklasse wie versiegelt können Sie diese Hierarchie noch weiter erweitern.

Es ist wichtig zu berücksichtigen, dass sich die Deklaration einer Klasse als versiegelt nur darauf bezieht, wer sie erweitern kann, aber weder die Erstellung von Instanzen der Hauptklasse einschränkt noch die Semantik der Klasse ändert, d. h. Das interne Verhalten der Klasse wird dadurch nicht verändert.

Das obige ist der detaillierte Inhalt vonVersiegelte Klassen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn