シールド クラスは、Java バージョン 15 以降で導入された新機能で、モジュール内のクラス継承の制御と柔軟性を強化するように設計されています。シールされたクラスは、そのサブクラスに特定の制約を課し、制限され組織化されたクラス階層構造を可能にします。
まず、シールされたクラスとそのサブクラスは同じモジュール、または名前のないモジュールで宣言されている場合は同じパッケージに属している必要があります。これにより、シールされたクラスの階層内のすべてのクラスが特定の環境内でアクセスおよび管理できるようになります。
さらに、許可されたサブクラスはすべて、sealed クラスを直接拡張する必要があります。これにより、予期しない方法でサブクラスが分岐することなく、明確かつ簡潔な階層が確保されます。
次に、許可されたすべてのサブクラスは、スーパークラスによって開始されたシーリングをどのように継続するかを記述する修飾子を選択する必要があります。これらの修飾子には 3 つのオプションがあります:
1) Final: この修飾子は、サブクラスをクラス階層の最終レベルにし、それ以上の拡張を禁止します。
2) Sealed: この修飾子により、サブクラスをさらに拡張できますが、制限された方法で拡張できます。シールされたサブクラスのすべてのサブクラスは、シールされたスーパークラスによって明示的に許可される必要があります。
3) 非シール: この修飾子は、階層のサブクラスの部分をオープン状態に戻し、未知のサブクラスがそれを拡張できるようにします。
例として、Circle と Square という 2 つの許可されたサブクラスを持つ、sealed として宣言された Shape クラスを考えてみましょう。この場合、Circle は Final として宣言でき、Square は unsealed として宣言でき、未知のサブクラスがそれをさらに拡張できるようになります。
クラスは、final、sealed、non-sealed のうち 1 つの修飾子のみを持つことができることに注意することが重要です。クラスの封印と最終化は相反する目的を果たすため、同時に行うことはできません。
さらに、抽象クラスはシールまたは非シールとして宣言することもでき、抽象メンバーを持つことができます。シールされたクラスは、シールされているかシールされていない限り、抽象サブクラスを許可できます。
最後に、許可されたサブクラスのアクセシビリティは、シールされたクラスのアクセシビリティと一致する必要はありません。サブクラスは、シールされたクラスからアクセスできる限り、アクセス可能でなくてもかまいません。このため、将来のリリースでパターン マッチングがスイッチでサポートされる場合、一部のユーザーはデフォルト句なしでサブクラスを完全に切り替えることができなくなる可能性があります。
シールド クラスの概念をより深く理解するために、いくつかのコーディング例を見てみましょう。
以下のコード スニペットでは、シールされたクラス Currency が定義されています。
sealed class Currency permits Dinar { //:sealed Check out the non-sealed class inheritance for legal recommendations }
正当なサブクラスを作成するには、そのクラスを同じモジュール内で宣言し、Currency クラスを直接拡張する必要があります。シールされたクラスは、許可されたサブクラスが制限された方法でさらに拡張されたり、未知のサブクラスによって拡張が可能になったりすることを防ぐことはできません。したがって、ディナールは同じモジュール内に存在する必要があります。
コード スニペットをさらに進めると、非シール クラス Dinar はシール クラス Currency を拡張します。非シールクラスを使用すると、さらにサブクラスを作成および拡張できます。
public non-sealed class Dinar extends Currency { // This class can be extended by any unknown subclass }
ディナールを拡張できるサブクラスを制限したい場合は、クラスをシール済みとして宣言し、permits 句を通じてどのサブクラスが許可されるかを指定できます。
sealed class Dinar extends Currency permits JordanianDinar, KuwaitiDinar { // Only subclasses JordanianDinar and KuwaitiDinar are permitted }
サブクラス JordanianDinar と KawaitDinar は、Dinar と同じモジュールで宣言する必要があり、シールされたクラス Dinar を直接拡張する必要があります。希望する制限レベルに応じて、封印、非封印、さらには最終的なものにすることができます。
シールされたクラスを使用すると、関連するクラスの階層を作成し、作成および拡張できるサブクラスをより詳細に制御できるため、コードのカプセル化とモジュール性が向上します。また、不正なサブクラスを作成しようとした場合にコンパイラが警告できるため、型の安全性を強化するのにも役立ちます。
結論として、シールされたクラスは、クラス継承に対してより組織的かつ構造化されたアプローチを提供し、モジュール内でのより多くの制御と柔軟性を可能にします。サブクラスに制限を課し、さらなる拡張のためのオプションを提供することにより、シールド クラスは、より意図的で意図的なクラス階層を提供します。
以上がJava のシールドされたクラスのルールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。