Java語言的新密封Sealed類型簡介 - Ben Evans

19-11-02 banq
         

密封Sealed表示的概念是可以擴展一個類,但只能通過已知的子類型列表進行擴展,而不能通過其他任何擴展。

其他語言可能對功能的看法有所不同,但是在Java中,應將其視為代表“幾乎最終的”類的功能。

讓我們來看一個簡單示例的新語法的當前版本:

public abstract sealed class SealedPet permits Cat, Dog {
? ? protected final String name;
? ? public abstract void speak();
? ? public SealedPet(String name) {
? ? ? ? this.name = name;
? ? }
}

public final class Cat extends SealedPet {
? ? public Cat(String name) {
? ? ? ? super(name);
? ? }
? ??
? ? public void speak() {
? ? ? ? System.out.println(name +" says Meow");
? ? }
? ??
? ? public void huntMouse() {
? ? ? ? System.out.println(name +" caught a mouse");
? ? }
}

public final class Dog extends SealedPet {
? ? public Dog(String name) {
? ? ? ? super(name);
? ? }
? ??
? ? public void speak() {
? ? ? ? System.out.println(name +" says Woof");
? ? } ? ? ? ?

? ? public void pullSled() {
? ? ? ? System.out.println(name +" pulled the sled");
? ? } ? ? ? ?
}

SealedPet現在是一個abstract sealed類,它是迄今為止Java中尚未允許使用的關鍵字。其次,使用第二個新關鍵字,permits可使開發人員列出此密封類型的允許子類。(如果未提供允許的子類型列表,則從同一編譯單元中的子類型推斷出來。)

Pet的任何實例都必須是一個Cat或一個Dog這兩個子類中一個。

而且,編譯器也可以使用此信息。這意味著庫代碼現在可以安全地假設這是唯一的可能性,并且客戶端代碼不會違反此假設。

用面向對象的編程理論來說,這代表了一種新的形式關系:一個對象o是一個is-a Cat或Dog,o是Cat和Dog的并集。

從表面上看,這些類型似乎是Java中的一個全新概念,但是它們與枚舉的深層相似性應該為許多Java程序員提供一個良好的起點。實際上,在某個地方已經存在類似于求和類型的東西:multicatch子句中的exception參數的類型。

詳細挖掘點擊標題見原文

?

         

美女漫画大全