나는 그렇게 생각하는 데 사용 private val하고 private final val난 스칼라 기준에서 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 Reference가 말한 것과 같습니다 : private valis not private final val.
왜 scalac 은 다음 private val과 같이 취급 하지 private final val않습니까? 근본적인 이유가 있습니까?
private범위 개질제와 동일한 의미를 갖는다 package private자바있다. 당신은 말할 수 있습니다 private[this].
private는이 클래스의 인스턴스 만 볼 수 의미하는 private[this]동일한 인스턴스를 제외하고 - 단지이 경우 클래스 , private누군가를 허용하지 않는 값에 액세스하는 (같은 패키지 포함).
val, a 는 이미 불변이므로 왜finalScala에서 키워드 가 필요 합니까? 컴파일러는 왜 모든vals를 s와 같은 방식으로 처리 할 수final val없습니까?