密封類別是 Java 版本 15 及更高版本中引入的一項新功能,旨在為模組內的類別繼承提供更多控制和靈活性。密封類別對其子類別施加一定的約束,從而允許類別層次結構的受限和有組織的結構。
首先,密封類別及其子類別必須屬於同一模組,或者如果在未命名模組中聲明,則必須屬於同一套件。這確保了密封類別層次結構中的所有類別都可以在特定環境中存取和管理。
此外,每個允許的子類別都必須直接擴展密封類別。這確保了清晰簡潔的層次結構,沒有任何子類別以意外的方式分支。
接下來,每個允許的子類別必須選擇一個修飾符來描述它如何繼續由其超類別發起的密封。這些修飾符有三個選項:
1) Final: 此修飾符使子類別成為類別層次結構中的最終級別,禁止任何進一步的擴展。
2) Sealed: 此修飾符允許子類別進一步擴展,但方式受到限制。密封子類別的所有子類別必須得到密封超類別的明確允許。
3) 非密封: 此修飾符將子類別的層次結構部分恢復為開放狀態,允許未知的子類別擴展它。
舉個例子,考慮一個被聲明為密封的 Shape 類,它有兩個允許的子類 - Circle 和 Square。在這種情況下,Circle 可以聲明為 Final,而 Square 可以聲明為非密封,允許未知的子類別進一步擴展它。
要注意的是,一個類別只能有final、sealed 和non-sealed 中的一個修飾符。一個類別不可能同時被密封和最終,因為它們的目的相反。
此外,抽象類別還可以聲明為密封或非密封,並且可以具有抽象成員。密封類別可以允許抽象子類,只要它們也是密封或非密封的。
最後,允許的子類別的可訪問性不必與密封類別的可訪問性相符。子類別可以不太可訪問,只要密封類別仍然可以訪問它們。這可能會導致某些使用者在未來版本中當開關支援模式匹配時無法在沒有預設子句的情況下徹底切換子類別。
為了更好地理解密封類別的概念,讓我們來看一些編碼範例。
在下面的程式碼片段中,定義了一個密封類別Currency。
sealed class Currency permits Dinar { //:sealed Check out the non-sealed class inheritance for legal recommendations }
為了創建合法的子類,該類必須在同一模組中聲明,並直接擴展貨幣類。密封類別不能阻止其允許的子類別以受限方式進一步擴展或由未知子類別開放擴展。因此第納爾必須在同一個模組中。
進一步檢視程式碼片段,非密封類別 Dinar 擴充了密封類別Currency。非密封類別允許創建和擴展更多子類別。
public non-sealed class Dinar extends Currency { // This class can be extended by any unknown subclass }
或者,如果我們想要限制可以擴展 Dinar 的子類,我們可以將該類別宣告為密封的,並透過 Permits 子句指定允許哪些子類別。
sealed class Dinar extends Currency permits JordanianDinar, KuwaitiDinar { // Only subclasses JordanianDinar and KuwaitiDinar are permitted }
子類 JordanianDinar 和 KuwaitiDinar 必須在與 Dinar 相同的模組中聲明,並且必須直接擴展密封類 Dinar。它們可以是密封的、非密封的,甚至是最終的,這取決於所需的限制等級。
使用密封類,我們可以創建相關類的層次結構,並更好地控制可以創建和擴展哪些子類,從而在程式碼中提供更好的封裝和模組化。它還有助於增強類型安全性,因為如果我們嘗試建立非法子類,編譯器可以警告我們。
總之,密封類別為類別繼承提供了一種更有組織性和結構化的方法,允許在模組內實現更多的控制和靈活性。透過對子類別施加限制並提供進一步擴展的選項,密封類別提供了更深思熟慮和有意的類別層次結構。
以上是Java 中的密封類別規則的詳細內容。更多資訊請關注PHP中文網其他相關文章!