Oop 最终目的并盖章

Oop 最终目的并盖章,oop,final,sealed,Oop,Final,Sealed,为什么有人要将类标记为final或sealed?因为创建继承类型比大多数人想象的要困难得多。默认情况下,最好以这种方式标记所有类型,因为这将防止其他人从从未打算扩展的类型继承 是否应该扩展一个类型是由创建它的开发人员决定的,而不是后来出现并希望扩展它的开发人员。根据,“密封类主要用于防止派生。它们在编译时增加了另一个严格级别,提高了内存使用率,并触发了某些优化,从而提高了运行时效率。” 此外,来自: 版本控制:当一个类最初被密封时,它可以在将来更改为未密封,而不会破坏兼容性。(…) 性能:(

为什么有人要将类标记为final或sealed?

因为创建继承类型比大多数人想象的要困难得多。默认情况下,最好以这种方式标记所有类型,因为这将防止其他人从从未打算扩展的类型继承

是否应该扩展一个类型是由创建它的开发人员决定的,而不是后来出现并希望扩展它的开发人员。

根据,“密封类主要用于防止派生。它们在编译时增加了另一个严格级别,提高了内存使用率,并触发了某些优化,从而提高了运行时效率。”

此外,来自:

  • 版本控制:当一个类最初被密封时,它可以在将来更改为未密封,而不会破坏兼容性。(…)

  • 性能:(…)如果JIT编译器看到对使用密封类型的虚拟方法的调用,JIT编译器可以通过非虚拟地调用该方法来生成更高效的代码。(…)

  • 安全性和可预测性:类必须保护自己的状态,并且不允许自己被破坏。当类被解封时,如果任何在内部操作字段的数据字段或方法是可访问的且不是私有的,则派生类可以访问和操作基类的状态。(…)

这些都是很好的理由——事实上,直到我刚才查到它时,我才意识到性能优势的影响:)


版本控制和安全点似乎是代码信心方面的巨大优势,这在任何类型的大型项目上都是非常合理的。当然,它不是单元测试的替代品,但它会有所帮助。

Joshua Bloch在他的《有效Java》一书中谈到了这一点。他说“文档用于继承或不允许继承”。 关键是类在某种程度上是作者和客户端之间的契约。允许客户端从基类继承使该契约更加严格。如果要从基类继承,则很可能要重写某些方法,否则可以用组合替换继承。允许重写哪些方法,以及首先,你必须实现它们——应该有文档记录,否则你的代码可能会导致不可预知的结果

public interface Collection<E> extends Iterable<E> {    
  ...
  boolean add(E e);
  boolean addAll(Collection<? extends E> c);
  ...
}
公共接口集合扩展了Iterable{
...
布尔加法(E);

boolean addAll(CollectionA title不是一个真正的问题。因为这个类不想有任何孩子,我们应该尊重它的意愿。@klabranche:当他们将它更改为
spayed
neuted
类时,请告诉我。一个title不是一个真正的问题“骗子。你一定忽略了问号,这是本课程的最后一个字符。Re:“因为班级不想有孩子,我们应该尊重他们的意愿”原作者不应该对此发表意见。有趣的是,这是被否决的。我想听到一个反驳我在这里写的文章。我和下拉者在这一点上,但不要认为这是1—情况:)使用第三方代码已经被限制地密封会使生活变得悲惨,尤其是在错误的时候。需要解决。不止一次,我不得不包装有缺陷的类,因为保护级别有不必要的限制。对我来说,性能优势是唯一合理的优势。为什么作为使用类的开发人员,我不应该决定是否对它进行子类化?如果它不是为继承而设计的,我可以接受它“为什么作为使用类的开发人员,我不能决定”出于同样的原因,您不应该决定是否访问私有成员。因为设计类的开发人员认为这样会更安全。当然,有更严格和更软的方法。在javascript和其他“软”中,您不会找到私有和密封/最终关键字languages.FWIW:我很确定HotSpot不会从中获得太多性能优势,因为它支持动态去优化。基本上,它假设所有方法在实际加载另一个版本的方法之前都是非虚拟的。当这种情况发生时,它会返回并“去优化”任何它进行非虚拟调用以代替虚拟调用的地方。版本控制?我不这么认为。听起来就像你说的“你可以从类中删除'sealed'属性并重新编译”-这并不是你为什么要这么做的原因。性能?有趣!安全性?子类只能访问基类允许的内容。如果基类希望“保护”其数据,就不应该使用“受保护”属性。这不是密封整个类的原因。我错过了它。我认为如果您发布了一个“beta”类,版本控制将适用,可能是在您的公司内部。强制将其密封,直到该类达到“release”status.Security?具有受保护成员的公共基类,密封的派生类可以访问该成员,但其他任何人都不能从该类派生并干扰该成员。版本控制是指更改基类,而不是破坏所有子类。