2010-01-07 2 views
8

나는 Scala에 관해서이 다소 간단한 질문을 가지고있다. 다음 클래스 정의에 내가 가진 것을 감안할 때 :생성자 변수 (sic!)를 읽기 전용으로 노출하는 방법은 무엇입니까?

class Foo(var bar: Int) 

bar에 대한 초기 값을 전달 할 수 있어야합니다 Foo의 인스턴스를 생성 할 수있는 코드입니다. 그러나 barvar으로 정의하면 런타임시 사용자가 원하는 값이 아닌 값을 변경할 수 있습니다. 사용자는 bar 만 읽을 수 있어야합니다. bar 자체는 내부적으로 수정되므로 val은 옵션이 아닙니다.

답변

13

속성에 대한 읽기 전용은 쉽습니다. 해당하는 setter없이 getter 메서드를 만들면됩니다. 개인적으로 수정할 수있는 필드를 만드는 것도 쉽습니다.

  • 생성자 PARAM
  • 내부 수정 필드
  • 공공 게터
  • :

    여기 당신의 가장 큰 문제는, 당신은 같은 이름을 사용할 수 있도록 공유 공간하고자한다 전용 설정자

슬프게도 이것은 가능하지 않으며 각 역할마다 고유 한 이름이 필요합니다. 이 같은 mething :

class Bippy(bop0: Int) { 
    private[this] var privatebop = bop0 
    //privatebop is ONLY EVER used by the following getter and setter: 
    private def bop_=(x:Int) = privatebop = x 
    def bar = privatebop 
} 

당신이 명명 된 인수를 사용하는 방법에 대한 관심이 아니에요, 또는 Scaladoc에서 인수의 이름으로, 다음이 더욱 단축 될 수있는 경우 :

class Bippy(private[this] var privatebop) { 
    //privatebop is ONLY EVER used by the following getter and setter: 
    private def bop_=(x:Int) = privatebop = x 
    def bop = privatebop 
} 

UPDATE를

매개 변수를 다시 지정하는 가장 확실한 방법은 공장을 위의 기술 중 하나와 결합하는 것입니다.

object Bippy{ 
    def apply(bop: Int) = new Bippy(bop) 
} 

다음은 Bippy(42)이라고 할 수 있습니다. 일반 생성자와 동일하지만 new 키워드가 없습니다.

+0

좋은 답변, 정말 고마워요! – Malax

관련 문제