我想检查辅助构造函数的参数,但我不得不首先调用主构造函数。一种方法是将检查放在this
的调用中,但如果条件复杂,它可能会变得丑陋。
def this(initDollars: Int, initCents: Int) = {
this(if (initDollars >= 0 && initCents >= 0) initDollars * 100 + initCents else throw new Exception("Negative values"))
}
有更好的方法吗?
答案 0 :(得分:2)
为什么不首先调用主构造函数,然后再检查?结果是一样的。
def this(initDollars: Int, initCents: Int) = {
this(initDollars * 100 + initCents)
assert(initDollars >= 0 && initCents >= 0, "Negative values")
}
替代方案是使用apply
方法的伴随对象。
答案 1 :(得分:1)
您可以将代码转移到随播对象中的方法,但为什么不一起避免构造函数,只需在需要验证时使用伴随对象?
object Example { // To keep class & companion together
class Foo private[Foo] (val value: Int) {}
object Foo {
def apply(i: Int) = if (i>=0) new Foo(i) else throw new Exception("Wrong")
def apply(i: Int, j: Int) = {
if (i>=0 && j>=0 && i.toLong*100+j < Int.MaxValue) new Foo(i*100+j)
else throw new Exception("Bleh")
}
}
}
其中的作用如下:
scala> Example.Foo(-47)
java.lang.Exception: Wrong
at Example$Foo$.apply(<console>:15)
[...]
scala> Example.Foo(49,62)
res19: Example.Foo = Example$Foo@418c43ad
scala> res19.value
res20: Int = 4962
(在代码中不是REPL,你不需要将Example
包裹起来作为伴随对象;只需将它们放在同一个文件中。或者你可以在REPL中使用^ D.)