最终类的编译器有什么优势吗?当课程是最终的还是非最终的时候,它会做任何优化吗? 我看到很多类在库代码中声明为final,所以只是想知道。
答案 0 :(得分:5)
让我们首先得到最重要的事情:创建一个类final
是否主要是程序员做出的建模决策。 final
和非final
类具有不同的语义,因此纯粹出于性能原因而无法应用final
。
特别是,仅如果类为final
,您可以保证其属性和不变量。如果类是不是 final
,则子类可以出现并以某种方式覆盖方法,以便破坏(某些)属性和不变量。
最明显的例子是如果你想编写一个不可变类型:如果一个子类可以简单地用可变版本覆盖你的方法,那么你不能保证你的类型是不可变的,因为你希望你的类型是不可变的,必须为final
。
由于Scala标准库,Scala平台以及更广泛的Scala生态系统和社区有很多不可变类型,因此也会有很多final
类。
因此,重复一下:使类final
成为语义决策,它与优化无关。您通常无法选择是否使用final
课程,必须为final
以保留其不变量,或者它被设计为基类,在这种情况下,它可以为final
。
关于编译器优化的问题:是的,编译器有一个好处。它实际上与final
类不同,而是与final
方法有关。有一些优化,编译器必须证明此时不能覆盖方法。一般来说,这相当于解决暂停问题,但对于final
方法,这很简单。因此,例如,您始终可以内联对final
方法的调用。
答案 1 :(得分:0)
最终修饰符适用于类成员定义和类 定义。最终的类成员定义可能不会被覆盖 子类。最终的类可能不会被模板继承。决赛是 对象定义冗余。最终类或对象的成员 隐含地也是最终的,所以最终修饰符通常是 对他们来说也是多余的。但请注意,该值为常数 定义(第4.1节)确实需要一个明确的最终修饰符,即使它们也是如此 在最终的类或对象中定义。最终可能不适用于 不完整的成员,它可能不会合并在一个修饰符列表中 密封的。
对于编译器而言,性能或优势没有显着改善,只是语言约束的一部分。