val
은 명시 적으로 선언하지 않는 한 final
이 아니며 javap을 사용하면 Scalac이 바이트 코드에 final
을 삽입하지 않는다는 것을 확인합니다.어떻게 값을 변경할 수 있습니까?
val
은 컴파일러가이를 변경하려고 시도하는 코드를 작성하지 못하도록하기 때문에 불변합니다.
val
당신이 초기 선언 후 아무것도 할당하여 변수를 변경 (돌연변이) 할 수 없음을 의미 :
val
은 명시 적으로 선언하지 않는 한 final
이 아니며 javap을 사용하면 Scalac이 바이트 코드에 final
을 삽입하지 않는다는 것을 확인합니다.어떻게 값을 변경할 수 있습니까?
val
은 컴파일러가이를 변경하려고 시도하는 코드를 작성하지 못하도록하기 때문에 불변합니다.
val
당신이 초기 선언 후 아무것도 할당하여 변수를 변경 (돌연변이) 할 수 없음을 의미 :
final
과 불변성은 두 개의 직교 개념이다가 구현 있어요 JVM 바이트 코드에서
val x = 1
x = 2 // error: reassignment to val
개인 회원과 게터를 생성하지만, 세터하지 :
class A {
val x = 1
}
=>
// Java equivalent of a generated bytecode
public class A {
private final int x;
public int x() { return x; }
...
}
final
은 '당신이 할 수있는 의미 t는 서브 클래스에 val
를 오버라이드 (override) : 당신이 var
대신 val
를 사용하는 경우
class A {
final val x = 1
}
class B extends A {
override val x = 2
}
// error: overriding value x in class A of type Int(1);
// value x cannot override final member
final
이 같은 오류가 발생합니다.
불행히도 Java는 이러한 최종 사용을 모았습니다. 자바에서 오는 것은 처음에 혼란 스러울 수 있습니다. – Phasmid
@Victor, 코멘트 주셔서 감사합니다. 따라서 'final'어플리케이션의 혼란을 한쪽으로 돌리면, scalac은 우리가'val'을위한'setter '를 구현하지 못하기 때문에'val'이 어떻게 변하지 않는가에 대한 제 질문에 답해 주시겠습니까? – JamieP
Scalac 자체는 val에 대한 setter를 구현하지 않습니다. 그래서 그것은 사실상 불변입니다. Java의 최종 필드조차도 열심히 시도하면 리플렉션을 사용하여 변형 될 수 있습니다. –
'val's이 'final'이 아닌 이유에 대해 [this] (http://stackoverflow.com/a/13428362/1263942)를 참조하십시오 : 재정의 할 수 있습니다 –