我正在将我的java代码移植到scala,并且有一个构造函数可以做很多事情:
构造函数生成相当多的(~20个)对象成员,即final(在scala中为val)。他们的创作并不是独立的,也要注意会议。显然,我不希望会话和其他临时内容成为构造实例成员。我如何在scala中执行此操作?
之前已经提出过类似的问题:
先前主题中给出的答案建议从初始化方法返回~20个字段的元组,或者创建一个私有构造函数,该构造函数将这些~20个值作为参数来自伴随对象apply方法。对我来说,这对猪来说都是丑陋的。
到目前为止,最明智的方法似乎是将这些字段声明为vars而不是vals,并在一些初始化方法中重新分配它们,这也有点气味。
答案 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个参数,所以如果你需要更多,你需要一个实际的课程......