例如,在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)
在创建对象之前,我可以采用备用构造函数逻辑并将其外部化以由辅助程序完成,但是如果可能的话,我想保留封装.
这有更好的模式吗?
您可以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).