检查辅助构造函数的参数

时间:2013-05-26 17:29:05

标签: scala

我想检查辅助构造函数的参数,但我不得不首先调用主构造函数。一种方法是将检查放在this的调用中,但如果条件复杂,它可能会变得丑陋。

def this(initDollars: Int, initCents: Int) = {
    this(if (initDollars >= 0 && initCents >= 0) initDollars * 100 + initCents else throw new Exception("Negative values"))
  }

有更好的方法吗?

2 个答案:

答案 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.)