我只需要一个类的实例,所以我必须使用一个对象而不是一个类。我还需要设置一些由客户端选择的初始值,所以我需要一个对象的构造函数,如下所示:
object Object1(val initValue: Int){
//.....
}
我不能在 Scala 中使用这个确切的代码。那我该怎么处理呢?
我只需要一个类的实例,所以我必须使用一个对象而不是一个类。我还需要设置一些由客户端选择的初始值,所以我需要一个对象的构造函数,如下所示:
object Object1(val initValue: Int){
//.....
}
我不能在 Scala 中使用这个确切的代码。那我该怎么处理呢?
你有几个选择:
让它成为一个类,让客户端构造它,在参数中给出值
Pro:保持不变性
Con:只有一个实例可能难以管理
将参数的变量添加到对象,添加setter。
优点:你仍然有一个单身人士
缺点:现在有可变状态
实现一个multiton
Pro:给你(明显的)不变性和单例(每个参数)
Con:更多的代码来实现
你可以在 scala 中实现这样的 multiton:
class Object1 private (val initValue: Int) {
// ...
}
object Object1 {
val insts = mutable.Map.empty[Int, Object1]
def apply(initV: Int) =
insts.getOrElseUpdate(initV, new Object1(initV))
}
更新你也可以把它变成一个“带参数的单例”:
object Object1 {
var inst: Option[(Int, Object1)] = None
def apply(initV: Int) = inst match {
case Some((`initV`, i)) => i
case Some(_) =>
sys.error("Object1 already instantiated with different param")
case None =>
val i = new Object1(initV)
inst = Some((initV, i))
i
}
}
在您引用它之前不会创建该对象,因此您可以执行以下操作:
object Test1 extends App {
var x = Console.readLine
println(Object1.initVal)
}
object Object1 {
val initVal:String = Test1.x
}