Проблема со вспомогательными конструкторами в Scala - PullRequest
1 голос
/ 23 июля 2011

Я наткнулся на этот вопрос: В Scala, как бы я смоделировал банковский счет в режиме без сохранения состояния? . Предлагаемое решение выглядит правдоподобно:

// Here is the important part of the answer
class Account(balance: Int) {
    def deposit(amount: Int): Account // the implementation was left out...
}

Проблема с этим решением заключается в том, что основной конструктор является общедоступным. Поэтому, если пользователь-программист создает новую учетную запись, он может передать ей произвольное значение. Что, если я всегда хочу, чтобы это было ноль? В любом случае, это новый аккаунт, почему его сумма должна быть не равна нулю?

Насколько я знаю, невозможно сделать открытый класс с закрытым первичным конструктором. С другой стороны, это возможно для вспомогательного конструктора быть личным , именно это я и пытался сделать.

class Account {
  val balance = 0

  private def this(amount: Int) = {
    this()
    balance = amount // won't compile since balance is a val
  }

  def deposit(amount: Int): Account = new Account(balance + amount)
}

Я точно знаю, в чем проблема, но я не знаю, как ее исправить, что немного смущает ...

Ответы [ 2 ]

10 голосов
/ 23 июля 2011

Первичные конструкторы могут фактически быть частными:

case class Account private(balance:Int)

object Account {
  def apply() = new Account(0)
}

println(Account())
//doesn't compile: println(Account(100))
3 голосов
/ 23 июля 2011

Небольшая вариация отличного ответа Ким, без объекта-компаньона:

class Account private(balance:Int) {
  def this() = {
    this(0)
  }  
  def deposit(amount: Int): Account = new Account(balance + amount)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...