scala构造函数 - 局部变量

时间:2014-05-08 08:08:34

标签: scala

我正在将我的java代码移植到scala,并且有一个构造函数可以做很多事情:

  1. 打开hibernate会话以加载数据
  2. 进行加载(现在会话保持打开状态!我需要进一步加载延迟)
  3. 对加载的数据执行一些操作并放入容器
  4. 将容器与其消费者联系起来
  5. .. blah blah
  6. close session
  7. 构造函数生成相当多的(~20个)对象成员,即final(在scala中为val)。他们的创作并不是独立的,也要注意会议。显然,我不希望会话和其他临时内容成为构造实例成员。我如何在scala中执行此操作?

    之前已经提出过类似的问题:

    先前主题中给出的答案建议从初始化方法返回~20个字段的元组,或者创建一个私有构造函数,该构造函数将这些~20个值作为参数来自伴随对象apply方法。对我来说,这对猪来说都是丑陋的。

    到目前为止,最明智的方法似乎是将这些字段声明为vars而不是vals,并在一些初始化方法中重新分配它们,这也有点气味。

2 个答案:

答案 0 :(得分:2)

我有一个技术上正确的解决方案,但它可能不是你想要的,因为它引入了大量的动词

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
    }
  }
}

所以没有构造函数既没有初始化方法,也没有采用许多变量,但它们是通过特征扩展传递的

答案 1 :(得分: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个参数,所以如果你需要更多,你需要一个实际的课程......