Chu*_*k94 6 open-closed-principle sealed-class java-17
简而言之,在 Java 的 LTS 版本 (Java 17) 中,我们第一次有了关键字sealed
,它使我们能够限制层次结构:
public abstract sealed class Person
permits Employee, Manager {
//...
}
Run Code Online (Sandbox Code Playgroud)
如果我想创建一个扩展基类的新子类Person
,我也必须修改基类。这是否违反开闭原则?
Bri*_*etz 19
开闭原理不是物理定律,而只是在某些情况下可能有用的指导原则。来自Effective Java 的另一个有用的原则是“为扩展而设计,否则就禁止它”。(另外:“更喜欢组合而不是继承”。)就我个人而言,我发现Effective Java 中的指导远比开闭原则有用;设计扩展类充满了权衡,而且常常是有问题的。
密封类可以被认为是最终类的概括,只是应用于不同的粒度级别。以前,禁止扩展仅适用于具体类 ( final
),但现在它适用于整个层次结构。
但是,这个问题的前提——“如果我想添加……”——本身就是有问题的。密封类是一种机制,允许 API 所有者通过控制抽象的所有实现(或通过限制对特定扩展点的扩展)来维护其 API 的完整性。API 所有者已经根据以下假设设计并实现了层次结构有一组固定的实现;那么“添加”实际上就变成了“扔掉他们的设计并用不同的东西替换它”。如果 API 的设计不是为了扩展,那么事后猜测设计者的意图就是一件冒险的事情。
归档时间: |
|
查看次数: |
1333 次 |
最近记录: |