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

时间:2013-06-03 16:26:17

标签: scala

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

object Object1(val initValue: Int){
  //.....
}

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

2 个答案:

答案 0 :(得分:13)

您有几个选择:

  1. 使它成为一个类,让客户端构造它,在参数
    中给出值 亲:保持不变性 骗局:只有一个实例可能难以管理

  2. 为对象添加一个变量给该对象,添加一个setter 亲:你还有一个单身人士 骗局:现在有可变状态

  3. 实施multiton
    Pro:给你(明显的)不变性和单身(每个参数)
    Con:实施更多代码

  4. 你可以在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
      }
    }
    

答案 1 :(得分:4)

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

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

object Object1 {
  val initVal:String = Test1.x
}