在日常编程(包括web开发)中,是否有特定的原因需要声明一个类或方法为final?请提供一个真实世界的例子来说明应该如何使用。
顺便说一下,我之所以问这个问题,是因为我正在尝试挑选一个“鲜为人知”的关键字并掌握它。
在日常编程(包括web开发)中,是否有特定的原因需要声明一个类或方法为final?请提供一个真实世界的例子来说明应该如何使用。
顺便说一下,我之所以问这个问题,是因为我正在尝试挑选一个“鲜为人知”的关键字并掌握它。
它可以防止其他程序员对您的类进行不想要的操作。因此,您可以设计它,使他们不会被诱惑去覆盖它并以那种方式滥用它,而不是只写一个注释说“不要使用这个类来做XXX”。
编辑: 因为需要一个例子,我描述一个可能会发现这个关键字实用的情况…比如说你有一个定义了两个对象如何相互通信的类,比如一个监听器和通知器。显然,监听器类必须允许继承,但你可能想把通知器类设为final,以便它必须以“has-a”的关系使用。这样,你就可以从你的监听器对象中推断出它们接收到的消息的性质。
否则,从那个类继承将是可能的,会做各种疯狂的事情,例如扩展消息等。如果您不希望其他程序员这样做,则可以将该类设置为final。此外,这在广泛使用的公共API中可能更有意义,因为它还允许其他程序员轻松了解哪些类可用于子类化。
另外一个例子--假如你有一个基于缓冲区的流处理器,在read()/write()方法内部,你维护了关于对象当前状态的一些数据(即当前字节或其他)。无法保证任何子类化这个类的人在处理过程中调用超类的方法--由于这样的类可能只包含几个方法,最好将整个类设为final而不是每个方法。这再次强制使用该类的人“has-a”,而不是“is-a”,从而可以控制您期望代码将如何执行。
我同意你的观点,在一个蓝月球中使整个类final可能是很少需要做的事情,但很好PHP有这种能力,如果您选择行使它。
"强制组合优于继承"这句话说得非常简洁明了。您可以保证您的类具有某种行为,没有其他东西可以干扰,正如下一节所解释的那样,这也可以带来安全性方面的好处。
有些人声称,除非你特别打算允许并已经考虑了它的多态扩展影响,否则应该将所有类声明为final。我倾向于认为这意味着对与您的代码一起工作的其他人有很大的不信任,但不幸的是,有时确实如此。
final(在C#中为sealed)可用于(类库设计者)强制执行类的某些基本行为。
例如,强制执行字符串具有不可变行为
Java中的字符串类被标记为final,在C#中被标记为sealed。
所有字符串都是不可变的,这种行为无法更改。