Java语言的新密封Sealed类型简介 - Ben Evans


密封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参数的类型。

详细挖掘点击标题见原文