例如,在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)}
}
在创建对象之前,我可以使用备用构造函数逻辑并将其外部化以由助手完成,但是如果可能的话,我想保留封装。
这有更好的模式吗?
答案 0 :(得分: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)
}
}
然后拨打x("1,2,3")
会给你x(1,2,3)
。