2014-05-08 34 views
2

我端起我的Java代碼來斯卡拉,並有一個構造函數確實頗有些東西:斯卡拉構造局部變量再次

  1. 開放Hibernate的Session加載數據
  2. 做加載(即現在的會話保持開放!我需要延遲加載進一步上)
  3. 執行上加載的數據的一些操作,放在容器
  4. 領帶容器與消費者
  5. ..blah等等
  6. close session

該構造函數產生相當多的(〜20)對象成員,即final(val in scala)。他們的創作不是獨立的,也注意到了會話。顯然,我不希望會話和其他臨時的東西成爲構建實例成員。我如何在Scala中做到這一點?

類似的問題已經被問過:在前面的主題給出

答案建議要麼返回〜20場的從初始化方法的元組,或創建一個私有構造函數,它將〜20個值作爲伴隨對象應用方法的參數。要麼我看起來很醜陋。

到目前爲止,最明智的方法似乎是將這些字段聲明爲變量,而不是vals,並將它們重新分配給一些初始化方法,這也有點異味。

回答

2

我有一個技術上是正確的解決方案,但它可能不是你想要的,因爲它引入了很多verbocity的

trait Example { 
    val a1 : Int 
    val a2 : Int 
    val a3 : Int 
    val a4 : Int 
    val a5 : Int 
    val a6 : Int 
} 
object Example { 
    def apply(seed : Int) : Example = { 
    val x1 = seed + 1 
    val x2 = x1 * 2 
    val x3 = x2/3 
    val x4 = x3 + x1 
    val x5 = x4 * x2 
    val x6 = x5 - x4 
    new Example { 
     override val a1 = x1 
     override val a2 = x2 
     override val a3 = x3 
     override val a4 = x4 
     override val a5 = x5 
     override val a6 = x6 
    } 
    } 
} 

所以沒有構造既不初始化方法,它有很多的變數,但他們通過延伸

+0

我知道它的權利,這是java代碼等價:'接口示例{0} {0} {0} {0} int a1(); int a2(); (int seed){ final int x1 = seed + 1; final int x2 = x1 * 2; 返回新實例(){ INT A1(){回報X1;} INT A2(){回報X2;} } } }'PS愚蠢的評論格式化 – enlait

+0

我來到斯卡拉不需要在Java以往的經驗,但你的代碼似乎很粗略等效 – ayvango

+0

我認爲這實際上是相當簡潔的解決方案,非常易讀,易於理解。 – enlait

0

另一個(復)方式的性狀傳遞將是這樣的:

import Person.getParams 

class Person private (t: (Int, String, String)) { 
    val a = t._1 
    val b = t._2 
    val c = t._3 

    def this(filename: String) { 
    this(getParams(filename)) 
    } 
} 

object Person { 
    def getParams(filename: String): (Int, String, String) { 
    // do some logic with filename which results in the relevant tuple 
    // return the tuple 
    } 
} 

當然,這被限制在22 parame因此,如果你需要更多,你將需要一個實際的類...