2017-09-27 6 views
1

私はクラスのコンストラクタ内でvalを定義しようとしていますが、動作させられません。私はそれを2度実行したくないので、かなり強力な計算です。私はこの次のリンクを見ましたが、私はこのコードで、それは仕事をdoesntのことをやるしようとすると、(私が取得まだ「パラメータを取らないアプリケーション」):Scalaで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(), 
    ) 
    } 

私のような何かをしたいのですが

私は上記のように、「アプリケーションはパラメータを取らない」ということになります。これについてどうすればいいですか?私はコンパニオンオブジェクトとapply方法でこれを書くでしょう

答えて

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

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) 
    } 
    } 
関連する問題