【发布时间】:2015-09-22 18:27:03
【问题描述】:
假设我们有一个类构造函数,它接受具有默认值的参数。
class A(val p1 : Int = 3, val p2 : Int = 4)
假设我无法控制这个类,也无法修改它。我想要做的是用 p1 = 5, p2 = 调用 A 的构造函数(如果 condition1 == true 那么 5 else 默认值)。一种方法是
if(condition1)
x = new A(5,5)
else
x = new A(5)
如您所见,如果有很多参数并且每个参数都必须有条件地提供,那么这很容易变大。我想要的是类似的东西
x = new A(p1 = 5, p2 = <if condition1 = true then 5 else default>)
我该怎么做?注意A类中的字段是vals,所以实例化A后我不能改变它们。
【问题讨论】:
-
为什么不只是
val x = if (condition) new A(5, 5) else new A(5)? -
我建议不要在超过几个值的情况下使用默认参数。当您忘记设置值时,编译器将不再能够告诉您。随着代码库的成熟和新价值的添加,这种做法不可避免地会导致错误,至少这是我的经验。仅对于少数几个值,组合爆炸 N/A。默认参数失败的一个很好的例子是 akka 1.3.x 中的超时。
-
@drstevens - OP 无法控制被调用的类;他正试图弄清楚如何处理它。
-
这似乎是构建器模式适用的问题类别。
-
我写了一篇博客文章,其中包含一个宏解决方案,它提供了这种语法here。
标签: scala