从辅助构造函数初始化val

时间:2013-05-26 15:23:23

标签: scala

我有以下课程代表一些金额:

class Money(initDollars: Int, initCents: Int){

  require (initDollars >= 0 && initCents >= 0)

  private def this(positive: Boolean, initDollars: Int, initCents: Int) = {
    this(initDollars, initCents)
    //this.positive = positive
  }

  val positive: Boolean = true
  val dollars = initDollars + initCents/100
  val cents = initCents % 100
  private val totalAmount = dollars * 100 + cents

  def unary_- = new Money(!positive, dollars, cents)
}

object Money{
  def apply(initDollars: Int, initCents: Int) = new Money(initDollars, initCents)
}

金额也可能是负数,我想像这样创建:

val am = -Money(1, 20)

所以我想从辅助构造函数初始化val positive,但我不能这样做,因为它重新分配给val。我也无法在辅助构造函数的参数列表中添加val。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:8)

反过来做。

class Money private (pos: Boolean, initDollars: Int, initCents: Int) {

  require (initDollars >= 0 && initCents >= 0)

  def this(initDollars: Int, initCents: Int) = {
    this(true, initDollars, initCents)
  }

  val positive: Boolean = pos
  val dollars = initDollars + initCents/100
  val cents = initCents % 100
  private val totalAmount = dollars * 100 + cents

  def unary_- = new Money(!positive, dollars, cents)
}

答案 1 :(得分:2)

我认为为了实现您的目标,您必须进行以下结构修改:

class Money(initDollars: Int, initCents: Int, positive: Boolean)

这样,您就可以编写一个 less 参数的构造函数,而不会出现问题(例如省略“positive”)。如果你想坚持不可变的值,那么在Scala中反过来这样做会很难。

如果您的课程正文中有以下声明:

val positive: Boolean = true

您将无法再更改positive,无法改变它:)

答案 2 :(得分:1)

切换到一个构造函数,在结尾添加正数,并将其默认值设为true,如下所示:

positive:Boolean = true

这种方式如果没有提供则默认为true。然后对apply函数执行相同操作,并在apply中调用3字段构造函数。