Scala:在构造函数外部的类中初始化val

时间:2014-01-03 15:21:15

标签: scala

在Java中,我知道定义具有4个或5个以上参数的构造函数或方法是不好的。

在Scala中,首选使用val而不是var

我的课程有很多字段(比如7个字段或10个字段)。 实例化后,大多数字段都不会更改。 所以我正在尝试将val用于这些字段。 但是,在我能想到的类中初始化val的唯一方法是将它们传递给主构造函数。

class Person(
    val name: String,
    val gender: String,
    val age: Int,
    val height: Double,
    val weight: Double,
    val birthday: Date,
    val address: String) {
  def printInfo(): Unit = {
  ...
  }
  ...
}

但是这样,主构造函数看起来很难看。不仅是它的定义,还要调用构造函数。

val person = new Person(
  parser.getName(), parser.getGender(), parser.getAge(), ..., parser.getAddress())

这看起来不太好。

如果它们是var,我可以使用其他方法来设置它们。但是,现在它们是val s,因此以后无法更改。

除了使用主构造函数之外还有更好的方法吗?或者我应该在这种情况下使用var

3 个答案:

答案 0 :(得分:6)

有时,格式化(可能还有一些别名)会让世界变得与众不同。添加一些命名参数,然后在介质上烘烤20分钟......

世界可以成为你的牡蛎:

case class Person(
  name     : String,
  gender   : String,
  age      : Int,
  height   : Double,
  weight   : Double,
  birthday : Date,
  address  : String
) {
  ...
}

val p = parser

val person = Person(
  name    = p.getName(),
  gender  = p.getGender(),
  age     = p.getAge(),
  ...
  address = p.getAddress()
)

答案 1 :(得分:1)

使用构建器模式。构建器可以使用var来跟踪将用于初始化的数据,然后可以立即初始化类。它仍将具有所有这些参数,但您可以隐藏它们在构建器中的使用情况。

你甚至可以更进一步拥有类型安全的构建器,但这是一种先进的技术,增加的复杂性通常不值得。

答案 2 :(得分:0)

您可以让Person类的构造函数使用解析器并在类中执行“获取”逻辑