2013-05-26 3 views
0

2 차 생성자의 인수를 확인하고 싶지만 우선 기본 생성자를 먼저 호출해야합니다. 한 가지 방법은 호출 내에서 수표를 this에 넣는 것입니다. 그러나 조건이 복잡하면 추악해질 수 있습니다.2 차 생성자의 인수를 확인하십시오.

def this(initDollars: Int, initCents: Int) = { 
    this(if (initDollars >= 0 && initCents >= 0) initDollars * 100 + initCents else throw new Exception("Negative values")) 
    } 

더 좋은 방법이 있습니까?

+1

호출 후 인수를 항상 확인할 수 있습니다. 실패한 경우, 값을 검사하고 예외를 던지거나 2 차 생성자에 전달할 값을 리턴하는 함수를 작성하십시오 :'this (validateAndSum (initDollars, initCents))' –

+0

정말 좋은 생각이 있지만 작동합니다 우리가 하나의 매개 변수를 가지고 있다면 – damluar

+1

튜플을 가지고있는 2 차 생성자를 가질 수 있습니다. 어쨌든 2 차 생성자입니다. 클래스 사용자는 아마도 그것을 볼 수 없을 것입니다. –

답변

1

코드를 컴패니언 개체의 메서드로 전송할 수는 있지만 생성자를 모두 피하고 유효성 검사가 필요할 때 동반자 개체를 사용해야하는 이유는 무엇입니까? 그래서 같은 작품

object Example { // To keep class & companion together 
    class Foo private[Foo] (val value: Int) {} 
    object Foo { 
    def apply(i: Int) = if (i>=0) new Foo(i) else throw new Exception("Wrong") 
    def apply(i: Int, j: Int) = { 
     if (i>=0 && j>=0 && i.toLong*100+j < Int.MaxValue) new Foo(i*100+j) 
     else throw new Exception("Bleh") 
    } 
    } 
} 

: 그 객체를 동반자가 될 수 있도록 코드에서 (

scala> Example.Foo(-47) 
java.lang.Exception: Wrong 
    at Example$Foo$.apply(<console>:15) 
     [...] 

scala> Example.Foo(49,62) 
res19: Example.Foo = [email protected] 

scala> res19.value 
res20: Int = 4962 

하지 그것을 REPL, 당신은 Example에 포장 할 필요가 없습니다, 그냥 같은 파일에 있습니다 또는 REPL에서^D를 사용할 수 있습니다.

2

먼저 기본 생성자를 호출하고 이후에 확인해야하는 이유는 무엇입니까? 결과는 같습니다.

def this(initDollars: Int, initCents: Int) = { 
    this(initDollars * 100 + initCents) 
    assert(initDollars >= 0 && initCents >= 0, "Negative values") 
} 

대안은 apply -method 인 보조 개체입니다.

+0

예를 들어 계산에 소요되는 시간을 절약하려면 – damluar

+0

심각하게? 나는 저장된 나노초보다 읽을 수있는 코드를 갖고 싶습니다. – Landei

+0

또한 '기본'생성자에서 유효성 검사를하면 호출 될 때도 항상 전제 조건이 충족된다는 것을 보장합니다. 'companion'객체의'apply' 메소드 ... – Shrey