2012-06-25 5 views
7

파라 메트릭 필드 (예 : 아래 예에서 x)은 일반적인 필드처럼 동작합니다. 그래서 당신이 방법에서 그 (것)들을 참조 할 수스칼라의 파라 메트릭 필드 및 생성자 인수

class Test(val x: Int) { // x is a parametric field 
    override def toString = "Test: " + x; 
} 

을하지만, 당신은 키워드 val를 떨어 뜨린 경우 코드는 여전히 컴파일 (및보고와 .class 출력은 x는 여전히 클래스의 멤버). 궁금한 점은 파라 메트릭 필드 (즉, 위의 val x: Int)와 생성자 인수 (x: Int)의 차이점은 무엇입니까?

는 (내 머리 뒤쪽에서 자바로, 나는이 toString 같은 방법을 포함하지 x 에 같은 생성자의 범위를 예상했을 것이다.)이 val 키워드없이

+0

하게된다 접두어가'val'인지 여부에 관계없이 적어도 하나의 메소드에서 참조되는 경우 멤버가옵니다. – adelbertc

답변

9

, 당신의 코드는 비슷합니다 : class Test (private[this] val x: Int) { ... }. 따라서 x은 수업 전체에서 사용할 수 있지만 외부에서는 사용할 수 없습니다.

질문에 언급되지 않았지만 유용 할 수도 있습니다. case class의 기본 수정자는 val입니다. 따라서 case class Test(x: Int) {...}case class (val x: Int) {...}과 같습니다.

+2

'case class'가 가지고있는 다른 것들을 모두 빼기. :-) –

+0

@ DanielC.Sobral 실제로 수정 한 오타가 오타가 아니기 때문에 실제로는 정확하지 않습니다. ;) – Nicolas

2

적어도 하나의 메소드에서 참조되는 경우에만 생성자 매개 변수가 효과적으로 private[this] 필드가됩니다. 그렇지 않으면 필드가 클래스에서 생성되지 않습니다. 예를 들어

:

class Foo(i: Int) { 
    println(i) 
} 

는 x`가 여전히 나는 '믿을

$ javap -private Foo 
Compiled from "Foo.scala" 
public class Foo extends java.lang.Object implements scala.ScalaObject{ 
    public Foo(int); 
} 

그러나

class Bar(i: Int) { 
    def baz = println(i) 
} 

$ javap -private Bar 
Compiled from "Bar.scala" 
public class Bar extends java.lang.Object implements scala.ScalaObject{ 
    private final int i; 
    public void baz(); 
    public Bar(int); 
} 
관련 문제