在scala中,如何从不同的输入实例化一个类?

时间:2014-09-23 03:31:21

标签: scala

例如,在C ++中,我可以执行以下操作:

class  x {
     int _a;
     int _b;
     int _c;
    public:
       x(int a, int b, int c) { _a = a; _b = b; _c = c; }
       x(y& other) {
                   sometype z = deserialize(y)
                   // ...do some magic
                   _a = z.a; _b = z.b; _c = z.c;
       }

}

所以我可以从离散参数(3个int)中实例化(x),或者定义一个构造函数,我接受(y)的实例,反序列化它,并从中提取数据。

scala中的

我希望有这个,因为在调用主构造函数之前我没有别的东西,所以没有用。

case class x (int a, int b, int c) { 
   def this(from:y ) { 
   val z = deserialize(x);  // this will fail
   // do some magic; 
   this(z.a, z.b, z.c)}
}

在创建对象之前,我可以使用备用构造函数逻辑并将其外部化以由助手完成,但是如果可能的话,我想保留封装。

这有更好的模式吗?

1 个答案:

答案 0 :(得分:5)

您可以在随播广告对象中添加自己的apply方法。

以下是一个简单示例,其中从字符串中读取abc

case class x (a: Int, b: Int, c: Int)

object x {
  def apply(s: String): x = {
    val ints = s.split(",")
    x(ints(0).toInt, ints(1).toInt, ints(2).toInt)
  }
}

然后拨打x("1,2,3")会给你x(1,2,3)