2013-05-09 6 views
1

스칼라에서 개체 - 개인 변수의 구현을 이해하려고합니다. 스칼라는 다음과 같은 자바 바이트 코드로이 클래스개체 - 개인 변수 구현

class Counter{ 
    private[this] var age = 0 
} 

을 컴파일 : JVM은 객체 개인 필드를 지원하지 않기 때문에,

public class Counter implements scala.ScalaObject { 
    private int age; 
    public Counter(); 
} 

하지만 여전히, 우리가 할 수있는 좋은 된 개인 필드가 클래스의 다른 인스턴스에서 액세스 할 수 있습니다. 그래서 제게는 사적인 영역을 숨기는 관점에서 이전 클래스와 다음의 차이점이 명확하지 않습니다.

class Counter2{ 
    private var age = 0 
} 

public class Counter2 implements scala.ScalaObject { 
    private int age; 
    private int age(); 
    private void age_$eq(int); 
    public Counter2(); 
} 
+0

[개인 \ [이 \] 대 개인적인] 가능한 복제본 (http://stackoverflow.com/questions/9698677/privatethis-vs-private) – zellus

+0

무엇이 당신의 질문은 무엇입니까? 명백한 차이점은 다른 인스턴스가 객체 - 전용 필드에 액세스하는 것이 컴파일 타임 오류라는 것입니다. 그러나 나는 당신이 그것을 알고 있다고 가정하기 때문에, 여기에 무엇이 묻히고 있는지 확신 할 수 없습니다. –

+0

JVM이 개체 전용 필드 – damluar

답변

1

JVM은 관련이 없습니다. Scala의 의미는 JVM이 아닌 Scala 컴파일러에 의해 구현됩니다. 결국 JVM은 스칼라 만 실행하는 플랫폼조차 아니며 CLI에서 스칼라를 프로덕션에 구현할 수 있으며 ECMAScript와 네이티브 스크립트에서 실험용으로 구현할 수 있습니다.

+0

을 지원하지 않는 경우, Scala 컴파일러는 개체 - 개인 필드에 대한 모든 액세스를 금지하므로이 메서드는 어떻게 구현됩니까? 맞습니까? – damluar

+0

자바 컴파일러조차도 개인 변수와 메소드에 액세스 할 수있는 바이트 코드를 생성하기도합니다. 예를 들어, 내부 클래스가 외부 클래스의 private 변수에 액세스하는 경우 그 이유는 Scala와 동일합니다. JVM의 데이터 모델은 Scala 나 최신 Java 버전의 데이터 모델과 완벽하게 맞지 않기 때문에 컴파일러는 조금 사기질을합니다. –

+0

물론 거의 모든 JVM은 결국 객체, 클래스, 인터페이스, 공개, 비공개, 보호, 메소드 등에 대해 모르는 원시 코드로 컴파일됩니다. –