您可以将代码转移到伴随对象中的方法中,但为什么不一起避免构造函数,而只在需要验证时使用伴随对象呢?
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。)