在Scala中具有参数的构造函数

Ala*_*ano 7 scala

我只需要一个类的一个实例,所以我必须使用一个对象而不是一个类.我还需要设置一个客户端选择的初始值,所以我需要一个对象的构造函数,如下所示:

object Object1(val initValue: Int){
  //.....
}
Run Code Online (Sandbox Code Playgroud)

我不能在Scala中使用这个确切的代码.那我怎么处理呢?

gzm*_*zm0 16

你有几个选择:

  1. 使它成为一个类,让客户端构造它,在参数
    Pro中提供值:保留不变性
    Con:只有一个实例可能难以管理

  2. 将param的变量添加到对象,添加setter.
    亲:你还有一个单身
    Con:现在有可变的状态

  3. 实现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))
}
Run Code Online (Sandbox Code Playgroud)

更新您还可以将其转换为"带参数的单例":

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
  }
}
Run Code Online (Sandbox Code Playgroud)

  • “带参数的单例”中的“apply()”不是线程安全的。 (2认同)

tsj*_*nsn 5

该对象在您引用它之前不会创建,因此您可以执行以下操作:

object Test1 extends App {
  var x = Console.readLine
  println(Object1.initVal)
}

object Object1 {
  val initVal:String = Test1.x
}
Run Code Online (Sandbox Code Playgroud)