1

我想调用服务器,但当且仅当数据(在这种情况下为 remoteIdKey)已过时。这是我的做法:

object remoteCaller {

 def getRemoteKeyId = {

   // do we need to get the data from the server?
   if (currentTime - lastCallTime >= 1000) {
      remoteId = makeRemoteCall
      lastCallTime = currentTime
    }

    remoteId
  }

  private var remoteId = 0
  private def currentTime = //....
  private var lastCallTime = //....
  private def makeRemoteCall = { //remote call to the server to get the remote Id key} 
}

问题是我改变了 and 的状态remoteCaller,因此使用var而不是val. 而且我还想使用对象而不是类来确保它只是它的实例。

如何使 remoteCaller 不可变或如何以功能样式(没有突变)?

4

1 回答 1

1

问题似乎是您想要实现两件互斥的事情:

  1. 可变状态
  2. 一个object只有 vals 的

正如@Felix 已经说过的,拥有可变状态本质上并不是坏事。在像您这样的情况下,我认为它可以,特别是如果它有助于避免不必要的复杂性。但尽管如此,你可以稍微清理一下。首先,我会将您当前拥有的可变状态包装到一个新类中。例如:

case class RemoteCall(remoteId: Int, lastCallTime: Int) {
    def refresh():RemoteCall = {
        if (currentTime - lastCallTime >= 1000) {
            RemoteCall(makeRemoteCall, currentTime)
        } else {
            this
        }
    }

    private def makeRemoteCall = { ... }
}

在您的RemoteCaller对象中,您将执行以下操作:

object RemoteCaller {

    // Your entire mutable state wrapped in a case class
    private var remoteCall:RemoteCall = ...

    def getRemoteKeyId = {
        remoteCall = remoteCall.refresh
        remoteCall.remoteId
    }

}
于 2013-05-27T15:18:53.283 回答