0

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

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

有更好的方法吗?

4

2 回答 2

2

为什么不先调用主构造函数,然后再检查?结果是一样的。

def this(initDollars: Int, initCents: Int) = {
    this(initDollars * 100 + initCents)
    assert(initDollars >= 0 && initCents >= 0, "Negative values")
}

apply另一种方法是使用-method的伴随对象。

于 2013-05-26T17:39:03.703 回答
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。)

于 2013-05-26T17:40:50.210 回答