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

banq發表於2019-11-02

密封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引數的型別。

詳細挖掘點選標題見原文


 

相關文章