2017-09-27 1 views
1

클래스의 생성자 안에 val을 정의하려고하지만 작동하지 않습니다. 꽤 강렬한 계산이므로 두 번 실행하지 않으려 고합니다. 나는이 다음과 같은 링크를 보았다하지만이 코드로 작업을 나던 그렇게 할 때 (내가 얻을 여전히 "매개 변수를 사용하지 않는 응용 프로그램") :스칼라에서 val 내부 클래스 생성자를 정의하는 방법

를 : How do you define a local var/val in the primary constructor in Scala?

class MyModel(
    val foo: String, 
    val bar: String, 
    val baz: String, 
) extends db.BaseModel { 
    def this() = this(
    foo = "", 
    bar = "", 
    baz = "" 
) 

    def this(
    foo: SomeModel, 
    bar: String, 
    baz: String, 
) = { 
    this(
     someModel.id, 
     doSomeComplexComputation(), 
     doSomeComplexComputation(), 
    ) 
    } 

내가 좋아하는 뭔가를하고 싶습니다

하지만 위에서 언급 한 것처럼 "응용 프로그램은 매개 변수를 사용하지 않습니다". 어떻게해야합니까?

답변

3

내가 동반자 객체에 생성자를 만드는 것이 좋습니다. 귀하의 경우에는, 이러한 구현이 작동 할 수 있습니다

class MyModel(val foo: String, val bar: String, val baz: String) extends db.BaseModel 

object MyModel { 

//empty constructor 
def apply(): MyModel = new MyModel("", "", "") 

//another constructor 
def apply(foo: SomeModel, bar: String, baz: String): MyModel = new MyModel(foo.id, doSomeComputation(bar), doSomeComputation(baz)) 
} 

이제 생성자를 호출 할 수

//create a MyModel object with empty constructor 
MyModel() 

//create a MyModel object with the second constructor 
MyModel(someModel, "string1", "string2") 
+0

이 작동처럼! 사용법을 언급 해 주셔서 감사합니다. 나는 아마 그 몇 번에 걸렸을 것이다 :) –

+0

문제는 친구가 아니다. 나는 처음에는 이해하기 위해 잠시 고생했다. 그래서 나는 그 사용법을 설명했다. :) – fcat

1

나는 동반자 객체와 apply 방법이를 작성합니다

class MyModel(
       val foo: String, 
       val bar: String, 
       val baz: String, 
       ) extends db.BaseModel 

    object MyModel { 
    def apply(): MyModel = new MyModel("", "", "") 
    def apply(foo: SomeModel, 
       bar: String, 
       baz: String): MyModel = { 
     val complexCalcSaved = doSomeComplexComputation() 
     new MyModel(someModel.id, complexCalcSaved, complexCalcSaved) 
    } 
    } 
관련 문제