복붙노트

[SCALA] 왜 개인 val`와`민간 최종 val` 다른`입니까?

SCALA

왜 개인 val`와`민간 최종 val` 다른`입니까?

내가 스칼라 기준에서 4.1 절을 볼 때까지 나는 개인 발과 민간 최종 발은 동일하다고 생각하는 데 사용 :

그리고 테스트를 작성했습니다 :

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
}

개인 발 민간 최종 발되지 않습니다 : 바이트 코드는 스칼라 참조 말한대로입니다.

왜 민간 최종 발 민간 발을 치료하는 단지 scalac하지 않는 이유는 무엇입니까? 어떤 근본적인 이유가 있나요?

해결법

  1. ==============================

    1.그래서, 이것은 단지 추측이지만, 오른쪽에 문자로 최종 정적 변수는 상수로 바이트 코드로 인라인 얻을 자바 다년생 두통이었다. 그건 확실히 성능 이점을 낳는다, 그러나 "상수는"지금까지 변경 한 경우 침입 정의의 바이너리 호환성이 발생합니다. 값이 변경해야 할 수도 있습니다 최종 정적 변수를 정의 할 때, 자바 프로그래머는 메소드 또는 생성자 값을 초기화 같은 해킹에 의지해야합니다.

    그래서, 이것은 단지 추측이지만, 오른쪽에 문자로 최종 정적 변수는 상수로 바이트 코드로 인라인 얻을 자바 다년생 두통이었다. 그건 확실히 성능 이점을 낳는다, 그러나 "상수는"지금까지 변경 한 경우 침입 정의의 바이너리 호환성이 발생합니다. 값이 변경해야 할 수도 있습니다 최종 정적 변수를 정의 할 때, 자바 프로그래머는 메소드 또는 생성자 값을 초기화 같은 해킹에 의지해야합니다.

    스칼라에있는 발은 자바 의미에서 이미 마지막이다. 스칼라의 디자이너는 "상수 값을 인라인 수있는 권한"을 의미하는 중복 수정의 마지막을 사용하는 것 같습니다. 그래서 스칼라 프로그래머는 해킹에 의지하지 않고이 동작을 완벽하게 제어 할 수 있습니다 : 그들은 인라인 일정 변경 없지만 빠르고 안 값을 원한다면, 그들은 "마지막 발"을 작성합니다. 그들은 유연성 그냥 "발", 바이너리 호환성을 깨지 않고 값을 변경하려는 경우.

  2. ==============================

    2.여기 혼란이 최종의 의미와 불변성을 가미하여에서 발생 생각합니다. 발스는 자식 클래스에서 재정의 할 수 있으므로 명시 적으로 표시하지 않는 한 최종으로 처리 할 수 ​​없습니다.

    여기 혼란이 최종의 의미와 불변성을 가미하여에서 발생 생각합니다. 발스는 자식 클래스에서 재정의 할 수 있으므로 명시 적으로 표시하지 않는 한 최종으로 처리 할 수 ​​없습니다.

    REPL @ 브라이언 라인 레벨에서 클래스 범위를 제공합니다. 보다:

    scala> $iw.getClass.getPackage
    res0: Package = package $line3
    
    scala> private val x = 5
    <console>:5: error: value x cannot be accessed in object $iw
      lazy val $result = `x`
    
    scala> private val x = 5; println(x);
    5
    
  3. from https://stackoverflow.com/questions/13412386/why-are-private-val-and-private-final-val-different by cc-by-sa and MIT license