谁能给我一个关于“啥使对象有状态”的这种情况的好例子?
Posted
技术标签:
【中文标题】谁能给我一个关于“啥使对象有状态”的这种情况的好例子?【英文标题】:Can anyone give me a good example of This kind of situation about "What makes an object stateful"?谁能给我一个关于“什么使对象有状态”的这种情况的好例子? 【发布时间】:2016-01-23 04:58:45 【问题描述】:我不明白这句话的意思(来自Scala-Threading/Odersky/18-stateful-objects.txt line 88):
一个类可能是有状态的,而无需定义或继承任何变量因为它会将方法调用转发给具有可变状态的其他对象。
谁能给我一个在 Scala 中这种情况的好例子吗?
【问题讨论】:
【参考方案1】:class Account
private var balance = 0
def getBalance = balance
def deposit(amount: Int): Unit = balance += amount
class NoVarAccount
val account = new Account()
def balance = account.getBalance
def deposit(amount: Int) = account.deposit(amount)
现在,NoVarAccount
中没有任何 var
,但它仍然是有状态的,因为它会将调用转发到确实有状态的 Account
。
事实上,你无法保证在同一个对象上调用balance
两次会得到相同的结果。
val account = new NoVarAccount()
account.balance // 0
account.deposit(42)
account.balance // 42
在此示例中,account.balance
不是引用透明,即您不能将 account.balance
替换为其返回值,因为它可能会有所不同。
相反,无状态帐户将如下所示:
class StatelessAccount(val balance: Int = 0)
def deposit(amount: Int) = new StatelessAccount(balance + amount)
或者更习惯用法:
case class StatelessAccount(balance: Int = 0)
def deposit(amount: Int) = this.copy(balance = balance + amount))
在这种情况下,balance
是引用透明的:
val account = StatelessAccount()
account.balance // 0
val account2 = account.deposit(42)
account2.balance // 42
account.balance // still 0
【讨论】:
【参考方案2】:class FileWrapper(file : java.io.RandomAccessFile)
def isEmpty = file.read() < 0
def next = file.read()
在上面的示例中,文件保持自己的状态,但 FileWrapper 仅将方法调用转发给文件对象。
【讨论】:
以上是关于谁能给我一个关于“啥使对象有状态”的这种情况的好例子?的主要内容,如果未能解决你的问题,请参考以下文章