2016-11-25 6 views
0

2つのファイルがあるとします。スカラクラス:新しいインスタンスの作成中にパラメータを避ける

  • myMainApplication.scala
  • printInfos.scala

簡単に言えばmyMainApplication.scalaは私のクラスmyMainApplication.scalaを作成することにより、名前と年齢をプリントアウトする必要があり

val name = "blah" 
val age= 45 

簡単に説明が含まれています新しいprintInfosインスタンス。しかし、私はインスタンスを作成する際にパラメータを追加するべきではありません。

私は避けたいもの:

インサイドprintInfos.scala

class printInfos(val myName: String, 
        val myAge: Int 
        val myLoc: String 
        val myNPP: Double 
        val myCountry: String 
        val myProvice: String 
        val myNPAP: String) { 

    def printInfos() = { 
     println("Your method printInfos print out" + myName + myAge + myLoc + myNPP + myCountry + myProvice + myNPAP) 
    } 

} 

インサイドmyMainApplication.scala

val name = "blah" 
val age= 45 
val loc = "blah" 
val npp = 45.5 
val country = "germany" 
val province = "bayern" 
val npap = "blaha" 
// want to avoid to enter so many params 
val printInfoInstance = new printInfos(name, age, loc, npp, country, province, npap) 
printInfoInstance.printInfos() 

を私はsomethiを取得したいと思い同様のNG:

インサイドprintInfos.scala

class printInfos() { 

     var myName: String = 0 
     var myAge: Int = 0 
     var myLoc: String = 0 
     var myNPP: Double = 0 
     var myCountry: String = 0 
     var myProvice: String = 0 
     var myNPAP: String = 0 

    def printInfos() = { 
     println("Your method printInfos print out" + myName + myAge + myLoc + myNPP + myCountry + myProvice + myNPAP) 
    } 

} 

インサイドmyMainApplication.scala

// want to create new instance with no params at begining 
val printInfoInstance = new printInfos() 

val name = "blah" 
printInfoInstance.myName() = name 
val age= 45 
printInfoInstance.myAge() = age 
val loc = "blah" 
printInfoInstance.myLoc() = loc 
val npp = 45.5 
printInfoInstance.myNPP() = npp 
val country = "germany" 
printInfoInstance.myCountry() = country 
val province = "bayern" 
printInfoInstance.myProvice() = province 
val npap = "blaha" 
printInfoInstance.myNPAP() = npap 

printInfoInstance.printInfos 

を改善

探して、sを取得することは可能であろう2番目の提案と似ていますが、の使用を避けてください。?しかし、最終的な目的は、新しいイントランスを作成するときに多くのパラメータを追加することを避けることです。

+0

これは役立つかもしれません:http://docs.scala-lang.org/tutorials/tour/default-parameter-values.html – maasg

答えて

3

私はスカラのケースクラスを使用することをお勧めします。変更されたパラメータを使用して新しいインスタンスを作成するためのコピーメソッドを提供します。これはすべてを不変に保ちます。すべてのパラメータを更新する必要はありません。一度に1つだけ行うことができます。

case class printInfos(myName: String = "", 
         myAge: Int = 0, 
         myLoc: String = "", 
         myNPP: Double = 0, 
         myCountry: String = "", 
         myProvince: String = "", 
         myNPAP: String = "") { 
    def printInfos() = { 
    println("Your method printInfos print out" + myName + myAge + myLoc + myNPP + myCountry + myProvince + myNPAP) 
    } 
} 

val printInfoInstance = new printInfos() 

val name = "blah" 
val age= 45 
val loc = "blah" 
val npp = 45.5 
val country = "germany" 
val province = "bayern" 
val npap = "blaha" 

val newInstance = printInfoInstance.copy(
    myName = name, 
    myAge = age, 
    myLoc = loc, 
    myNPP = npp, 
    myCountry = country, 
    myProvince = province, 
    myNPAP = npap 
) 

newInstance.printInfos() 
1

@longshorejに加えて、ケースクラスが定義されていることを前提とします。 newキーワードなしでインスタンス化することができます。 printInfos("name","age","loc","npp","country","province","npap")は、新しいインスタンスを作成します。

印刷部分については、toStringをオーバーライドして、標準的な用語と整列させることをお勧めします。

1

のことができるようにするために型システムの利益では、クラスの有効インスタンスを作成するために必要なすべてのパラメータが必要です。

毎回すべてのパラメータを渡すことを冗長にしたくない場合は、それらのデフォルト値を指定できます(本当に無効な中間状態を回避したい場合は、本当にオプションです)。

// named params or positionally 
InfoPrinter("blah", 45, country="germany", province="bayern").printInfos 

デフォルト値を持つ任意のパラメータを省略することができます:あなたは、このようにそれを使用することができます

// assuming it doesn't make sense to instantiate without 
// a few required parameters 
case class InfoPrinter (
    name: String,    // required 
    age: Int,     // required 
    loc: String = "", 
    NPP: Double = 0, 
    country: String = "", 
    province: String = "", 
    NPAP: String = "" 
) { 
    def printInfos = 
    println(s"Your method printInfos print out $name $age $loc $NPP $country $province $NPAP") 

} 

関連する問題