我应该在日常编程(网络或其他方式)中声明一个类或方法 final 有什么特别的原因吗?请提供一个应该使用它的真实示例。
顺便说一句,我问是因为我试图选择一个“晦涩”的关键字并掌握它。
我应该在日常编程(网络或其他方式)中声明一个类或方法 final 有什么特别的原因吗?请提供一个应该使用它的真实示例。
顺便说一句,我问是因为我试图选择一个“晦涩”的关键字并掌握它。
它可以防止其他程序员对您的类做您不打算让他们做的事情。因此,与其发表评论说“不要使用这个类来做 XXX”,不如设计它,让他们不会试图覆盖它并以这种方式滥用它。
编辑:由于请求了一个示例,我将描述一个您可能会发现这个关键字很方便的情况......假设您有一个定义两个对象如何相互通信的类,例如一个监听器和通知器。侦听器类显然必须允许继承,但您可能希望将通知器类设为 final,以便它必须在“具有”关系中使用。这样,您可以从侦听器对象中对它们接收到的消息的性质做出一些假设。
否则,就有可能从那个类继承,做各种疯狂的事情,比如扩展消息等等。如果您不希望其他程序员这样做,那么您可以将类设为 final。此外,这在广泛使用的公共 API 中可能更有意义,因为它还允许其他程序员轻松理解哪些类可以子类化。
另一个例子——假设你有一个基于缓冲区的流处理器,并且在你的 read()/write() 方法中,你维护一些关于你的对象当前状态的数据(即,当前字节或其他)。没有办法保证任何子类化这个类的人都会在处理过程中调用超类的方法——而且由于这样的类可能只包含几个方法,所以最好只使整个事情成为最终的而不是每个方法。这再次迫使人们使用该类“has-a”,而不是“is-a”,因此,可以控制您期望代码将如何执行。
我同意你的观点,让整个班级决赛可能是你需要在一个蓝月亮做一次的事情,但是如果你选择使用它,PHP 有这个能力是很好的。
“Enforce Composition over Inheritance”说得相当简洁。你保证你的类的某种行为是没有其他任何东西可以干扰的,正如下一节所解释的,它也可以具有安全优势。
有些人声称您应该将所有类声明为 final,除非您特别打算允许并检查了它的多态扩展的含义。我倾向于认为这意味着对任何其他正在使用您的代码的人有很大的不信任,但不幸的是,有时这是有道理的。
在许多语言中,将类声明为 final 也提供了优化好处,因为它不需要查看 virt 表中的方法。
如果你想强制执行类的意图,并且意图使得子类化没有意义,那么使用 final; 否则,没有显着优势。
一般来说,它只是一种强制执行意图的机制。
final 类是不能被子类化的类,因此您不想创建任何派生类。例如在 Java 中,Math 类是最终的,因为 Java 不希望您能够重新定义绝对值的含义。
final (并在 c# 中密封)可以(由类库设计者)用于强制类的一些基本行为。
例如强制字符串具有不可变行为
java 中的字符串类被标记为 final,而在 c# 中它被标记为密封。
所有字符串都是不可变的,并且该行为无法更改。