2016-11-25 41 views
0

假設我有2個文件。Scala類:創建新實例時避免參數

  • myMainApplication.scala
  • printInfos.scala

簡言之myMainApplication.scala包含

val name = "blah" 
val age= 45 

簡單地說我的課myMainApplication.scala應打印出的姓名和年齡通過創建新的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 

尋找改進

會得到它可能小號類似於第二個建議,但避免使用變種?但是,的最終目標仍然是在創建新實例時避免添加大量參數

+0

這可能有幫助:http://docs.scala-lang.org/tutorials/tour/default-parameter-values.html – maasg

回答

3

我建議你爲此使用scala的case類。它提供了一種複製方法,允許您使用更改的參數創建新實例。這使一切不變。請注意,您不必更新所有參數 - 您可以一次只做一個參數。

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

它是類型系統的好處能夠要求都創建一個類的有效實例所需的參數。

如果您想避免每次傳遞所有參數的詳細程度,您可以爲它們提供默認值(如果它們確實是可選的,那麼您真的想要避免無效的中間狀態)。

// 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") 

} 

然後,您可以使用它像這樣:

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

使用默認值的任何參數可以省略。