谁能给我一个关于“啥使对象有状态”的这种情况的好例子?

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 仅将方法调用转发给文件对象。

【讨论】:

以上是关于谁能给我一个关于“啥使对象有状态”的这种情况的好例子?的主要内容,如果未能解决你的问题,请参考以下文章

谁能给我介绍一下越南足球联赛的情况!

用java或者c程序输出如下图的这种简单心形,谁能给我讲讲思路。加上程序示例更好

谁能给我讲 TCP/IP

谁能给我一个详细的文件扩展名大全!

谁能给我科比的英文介绍?

.Net 4 并行扩展的好学习资料