最终类与非最终编译器优化

时间:2017-10-30 08:14:49

标签: scala

最终类的编译器有什么优势吗?当课程是最终的还是非最终的时候,它会做任何优化吗? 我看到很多类在库代码中声明为final,所以只是想知道。

2 个答案:

答案 0 :(得分:5)

让我们首先得到最重要的事情:创建一个类final是否主要是程序员做出的建模决策。 final和非final类具有不同的语义,因此纯粹出于性能原因而无法应用final

特别是,如果类为final,您可以保证其属性和不变量。如果类是不是 final,则子类可以出现并以某种方式覆盖方法,以便破坏(某些)属性和不变量。

最明显的例子是如果你想编写一个不可变类型:如果一个子类可以简单地用可变版本覆盖你的方法,那么你不能保证你的类型是不可变的,因为你希望你的类型是不可变的,必须final

由于Scala标准库,Scala平台以及更广泛的Scala生态系统和社区有很多不可变类型,因此也会有很多final类。

因此,重复一下:使类final成为语义决策,它与优化无关。您通常无法选择是否使用final课程,必须final以保留其不变量,或者它被设计为基类,在这种情况下,它可以final

关于编译器优化的问题:是的,编译器有一个好处。它实际上与final类不同,而是与final方法有关。有一些优化,编译器必须证明此时不能覆盖方法。一般来说,这相当于解决暂停问题,但对于final方法,这很简单。因此,例如,您始终可以内联对final方法的调用。

答案 1 :(得分:0)

根据Scala Reference manual

  

最终修饰符适用于类成员定义和类   定义。最终的类成员定义可能不会被覆盖   子类。最终的类可能不会被模板继承。决赛是   对象定义冗余。最终类或对象的成员   隐含地也是最终的,所以最终修饰符通常是   对他们来说也是多余的。但请注意,该值为常数   定义(第4.1节)确实需要一个明确的最终修饰符,即使它们也是如此   在最终的类或对象中定义。最终可能不适用于   不完整的成员,它可能不会合并在一个修饰符列表中   密封的。

对于编译器而言,性能或优势没有显着改善,只是语言约束的一部分。