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

Wil*_* Am 1 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;
       }

}
Run Code Online (Sandbox Code Playgroud)

所以我可以从离散参数(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)}
}
Run Code Online (Sandbox Code Playgroud)

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

这有更好的模式吗?

Kig*_*gyo 5

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

举个简单的例子,其中a,b,c是从一个字符串读取.

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

然后打电话x("1,2,3")会给你x(1,2,3).