2011-07-23 61 views
1

我偶然發現了這個問題:In Scala, how would I model a bank account in a stateless, functional manner?。所提出的解決方案看起來似是而非: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) 
} 

我知道問題是什麼,但我不知道如何解決它,這是有點尷尬......

+0

可能有[Private and protected co在斯卡拉nstructor](http://stackoverflow.com/questions/1730536/private-and-protected-constructor-in-scala) – oluies

+0

@oluies - 這是*不*一個重複。對於相同的答案,這是一個不同的問題。 – Malvolio

回答

9

主構造可實際上是私有:

case class Account private(balance:Int) 

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

println(Account()) 
//doesn't compile: println(Account(100)) 
+0

所以有可能畢竟thx – agilesteel

2

Kim的優秀答案略有差異,沒有伴侶對象:

class Account private(balance:Int) { 
    def this() = { 
    this(0) 
    } 
    def deposit(amount: Int): Account = new Account(balance + amount) 
} 
+0

thx,金實際上已經修改它。他的回答最初是這樣的:「主要構造函數可以是私有的」和一行代碼,它顯示了語法(這對我來說已經足夠了)。但是,無論如何。 – agilesteel