转载

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

密封Sealed表示的概念是可以扩展一个类,但只能通过已知的子类型列表进行扩展,而不能通过其他任何扩展。

其他语言可能对功能的看法有所不同,但是在Java中,应将其视为代表“几乎最终的”类的功能。

让我们来看一个简单示例的新语法的当前版本:

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

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

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

    <b>public</b> <b>void</b> pullSled() {
        System.out.println(name +</font><font>" pulled the sled"</font><font>);
    }        
}
</font>

SealedPet现在是一个abstract sealed类,它是迄今为止Java中尚未允许使用的关键字。其次,使用第二个新关键字,permits可使开发人员列出此密封类型的允许子类。(如果未提供允许的子类型列表,则从同一编译单元中的子类型推断出来。)

Pet的任何实例都必须是一个Cat或一个Dog这两个子类中一个。

而且,编译器也可以使用此信息。这意味着库代码现在可以安全地假设这是唯一的可能性,并且客户端代码不会违反此假设。

用面向对象的编程理论来说,这代表了一种新的形式关系:一个对象o是一个is-a Cat或Dog,o是Cat和Dog的并集。

从表面上看,这些类型似乎是Java中的一个全新概念,但是它们与枚举的深层相似性应该为许多Java程序员提供一个良好的起点。实际上,在某个地方已经存在类似于求和类型的东西:multicatch子句中的exception参数的类型。

详细挖掘点击标题见原文

原文  https://www.jdon.com/53368
正文到此结束
Loading...