2009-10-12 3 views
3

왜 생성자 매개 변수를 가리키는 것이 허용됩니까? 어떤 개인이 왜

class Foo(str: String) { 
    val len = str.length 
    def getLen = len 
    def getStr = str} 

public class Foo implements ScalaObject 
{ 

    private final int len; 
    private final String str; 
    public Foo(String str) 
    { 
     this.str = str; 
     super(); 
     len = str.length(); 
    } 

    public String getStr() 
    { 
     return str; 
    } 

    public int getLen() 
    { 
     return len(); 
    } 

    public int len() 
    { 
     return len; 
    } 

    public int $tag() 
     throws RemoteException 
    { 
     return scala.ScalaObject.class.$tag(this); 
    } 
} 

로 컴파일됩니다이 코드 그러나이 코드

class Foo(str: String) { 
    val len = str.length 
    def getLen = len 
} 

public class Foo implements ScalaObject 
{ 

    private final int len; 

    public Foo(String str) 
    { 
     len = str.length(); 
    } 

    public int getLen() 
    { 
     return len(); 
    } 

    public int len() 
    { 
     return len; 
    } 

    public int $tag() 
     throws RemoteException 
    { 
     return scala.ScalaObject.class.$tag(this); 
    } 
} 

로 컴파일됩니다 Foo 클래스의 멤버입니까?

private final String str; 

일종의 최적화입니까?

왜 생성자의 매개 변수를 가리키는 것이 허용됩니까? "def getStr = str"줄에 컴파일 타임 오류가없는 이유는 무엇입니까?

+0

+1 오늘 아침에 나는 똑같은 질문을하고 있었다 :-). – helpermethod

답변

1

Odersky 서적에 따르면 생성자는 필드를 생성자 인수와 필드를 일치시킬 수있는 유일한 곳입니다. 만약 당신이 그것을하지 않으면 생성자 밖에서 볼 변수가 없을 것입니다.

3

스칼라에서 생성자 매개 변수는 클래스 내의 어느 위치에서나 볼 수 있으므로 "객체 매개 변수"와 비슷합니다. 두 번째 스 니펫에서는 생성자 외부에서 참조하지 않기 때문에 클래스 속성을 만들도록 컴파일되지 않았습니다. 필요하지 않습니다.

+0

그러나 누가 생성자 매개 변수로 사용 된 객체의 수명을 관리해야합니까? –

+0

나는이 질문을 이해할 수 없다. 일반적인 물체는 참조가 없을 때 GC 될 수 있기 때문이다. Foo 클래스는 해당 객체의 수명을 관리하지 않습니다. (다른 인스턴스에서 인스턴스화되었으며 주변에 참조가 얼마나 많이 있는지 알고 있습니다.) 컴파일이 필요하지 않을 때 단순히 참조를 유지하지 않도록합니다. 이것은 다른 곳에서 수행되는 작업에 따라 더 빨리 GC 후보가 될 수도 있고 그렇지 않을 수도 있습니다. –

관련 문제