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