2016-10-03 10 views
4

val은 명시 적으로 선언하지 않는 한 final이 아니며 javap을 사용하면 Scalac이 바이트 코드에 final을 삽입하지 않는다는 것을 확인합니다.어떻게 값을 변경할 수 있습니까?

val은 컴파일러가이를 변경하려고 시도하는 코드를 작성하지 못하도록하기 때문에 불변합니다.

val 당신이 초기 선언 후 아무것도 할당하여 변수를 변경 (돌연변이) 할 수 없음을 의미 :

+1

'val's이 'final'이 아닌 이유에 대해 [this] (http://stackoverflow.com/a/13428362/1263942)를 참조하십시오 : 재정의 할 수 있습니다 –

답변

8

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이 같은 오류가 발생합니다.

+0

불행히도 Java는 이러한 최종 사용을 모았습니다. 자바에서 오는 것은 처음에 혼란 스러울 수 있습니다. – Phasmid

+0

@Victor, 코멘트 주셔서 감사합니다. 따라서 'final'어플리케이션의 혼란을 한쪽으로 돌리면, scalac은 우리가'val'을위한'setter '를 구현하지 못하기 때문에'val'이 어떻게 변하지 않는가에 대한 제 질문에 답해 주시겠습니까? – JamieP

+0

Scalac 자체는 val에 대한 setter를 구현하지 않습니다. 그래서 그것은 사실상 불변입니다. Java의 최종 필드조차도 열심히 시도하면 리플렉션을 사용하여 변형 될 수 있습니다. –

관련 문제