相关疑难解决方法(0)

为什么`private val`和`private final val`不同?

我曾经认为private val并且private final val相同,直到我在Scala参考中看到4.1节:

形式是常量值定义

final val x = e
Run Code Online (Sandbox Code Playgroud)

其中e是常数表达式(§6.24).必须存在最终修饰符,并且不能给出类型注释.对常量值x的引用本身被视为常量表达式; 在生成的代码中,它们被定义的右侧e替换.

我写了一个测试:

class PrivateVal {
  private val privateVal = 0
  def testPrivateVal = privateVal
  private final val privateFinalVal = 1
  def testPrivateFinalVal = privateFinalVal
}
Run Code Online (Sandbox Code Playgroud)

javap -c 输出:

Compiled from "PrivateVal.scala"
public class PrivateVal {
  public int testPrivateVal();
    Code:
       0: aload_0       
       1: invokespecial #19                 // Method privateVal:()I
       4: ireturn       

  public int testPrivateFinalVal();
    Code:
       0: iconst_1      
       1: ireturn       

  public PrivateVal();
    Code:
       0: aload_0       
       1: invokespecial #24 …
Run Code Online (Sandbox Code Playgroud)

scala final private

97
推荐指数
2
解决办法
2万
查看次数

标签 统计

final ×1

private ×1

scala ×1