我最近习惯在任何逻辑地使用final
关键字,就像任何永远不应该扩展的类一样。
我之所以这样做完全是因为我喜欢保持严格而简洁的编码风格。
除了在为其他方开发应用程序/游戏基础或与他人合作等情况下的明显优势之外,使用final
时是否有任何实际好处?即表现。
答案 0 :(得分:11)
根据this extensive test,final
关键字在性能方面没有丝毫差异。
在ActionScript中使用final
的方式,这并不奇怪:final关键字只标记类和类方法,因此它只影响继承。我认为没有合理的理由为什么调用final方法应该比调用任何其他方法更快:运行时仍然需要查找函数指针并执行调用。
methods and classes in Java也是如此。但是,在Java中,final
也是marks references as immutable。与在ActionScript中使用相比,这是一个很大的优势,因为它允许编译器“内联”值(即将字节代码中对变量的所有引用替换为其实际值,从而消除了查找过程),其中包括其他好处 - 可以加快性能。也许我们会在未来的ActionScript版本中看到一些这样的用法 - 这也是一个更好的代码清晰度和防止副作用的好主意。
出于这些原因,我仍然认为使用final
是好的做法,即使你不与其他程序员合作,在的情况下,其中预期的行为需要方法或类来禁止覆盖< / strong>:它澄清了意图并防止了不良后果。因此,它将加速发展,这也不是一件坏事;)
答案 1 :(得分:4)
在被问到一年后的重要更新 -
ActionScript Compiler 2.0在某些条件下添加了对函数内联的支持,其中之一是函数为static
或final
。请参阅:http://www.bytearray.org/?p=4789
另请注意,如果您要使用内联,则必须使用[inline]
元数据标记修饰函数,并使用-inline
编译器参数。
答案 2 :(得分:2)
我没有看到任何证据,无论是谷歌还是final
类别或方法比非最终版本运行得更快的经验,即使他们这样做,差异也可以忽略不计。
我看到的唯一用途是密封课程并停止覆盖。
答案 3 :(得分:1)
为防止类被扩展或方法被覆盖,我们在该类或方法定义之前加上最终属性。
它是如何工作的?
最后一堂课:
final public class A
{
//
}
最后一个方法:
public class A
{
final public function A
{
//
}
}
在ActionScript中使用final属性有两个原因:
在某些情况下,final方法比非final方法执行得更快。如果您希望以各种可能的方式提高应用程序的性能,请尝试将其方法设为最终。
最终帮助的方法隐藏了类的内部细节。使类或方法最终阻止其他程序员扩展类或重写方法以检查类的内部结构。这种预防被认为是防止应用程序被恶意利用的方法之一。
答案 4 :(得分:0)
Final
很少被使用且有理由。但是有时建议使用它。如其他人所说,它可以防止扩展类和/或覆盖方法。
以下是final
使用的一些答案,但它们都侧重于安全方面:
How could not using "final" be a security issue?
根据我的经验,使用final
的唯一真正有用的实例是在创建公共库时,您特别希望阻止覆盖特定方法和/或类的扩展。这与安全性无关,但与行为的封装有关。想想真实的例子有点难,但最简单的就是单身人士。如果您已经创建了一个可以作为单例访问的类,那么让我们的类用户能够扩展该类是没有意义的(我知道人们这样做,但他们确实不应该这样做)。而且,它将导致他们陷入痛苦的世界。在这种情况下,将班级标记为final
绝对是合适的。
- 编辑
免责声明:出于各种原因,我真的想阻止使用单例模式:它否定了多态性
它不允许继承
它违反了SRP
但由于它是如此受欢迎的模式,我不妨尝试通过使用关键字final