我曾经认为private val
和private final val
是一样的,直到我看到Scala参考手册4.1节:
常量定义的形式为
final val x = e
e是一个常量表达式(§6.24)。最终修饰符必须存在,不能给出类型注释。对常量值x的引用本身被视为常量表达式;在生成的代码中,它们将被定义的右侧表达式e替换。
我已经编写了一个测试:
class PrivateVal { private val privateVal = 0 def testPrivateVal = privateVal private final val privateFinalVal = 1 def testPrivateFinalVal = privateFinalVal }
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 // Method java/lang/Object."<init>":()V 4: aload_0 5: iconst_0 6: putfield #14 // Field privateVal:I 9: return }
字节码与Scala参考文档所述一致:
private val
并非private final val
。为什么scalac不能将
private val
视为private final val
?这背后是否有潜在的原因?
val
е·Із»ҸжҳҜдёҚеҸҜеҸҳзҡ„дәҶпјҢеңЁScalaдёӯдёәд»Җд№ҲиҝҳйңҖиҰҒдҪҝз”Ёfinal
е…ій”®еӯ—е‘ўпјҹдёәд»Җд№Ҳзј–иҜ‘еҷЁдёҚиғҪеғҸеҜ№еҫ…final val
дёҖж ·еҜ№еҫ…жүҖжңүзҡ„val
пјҹ - Jesperprivate
作用域修饰符在 Java 中具有与package private
相同的语义。您可能想要使用private[this]
。 - Connor Doyleprivate
意味着它只对该类的实例可见,而private[this]
则只对该实例可见——除了同一类的实例外,private
不允许任何人(包括同一包内的人)访问该值。 - Make42