0

我正在使用 akka 库并提供部分功能,由演员在运行时通过热交换实现。

akka 热交换采用 PartialFunction[Any, Unit] 形式的参数。我将我的定义如下:

class Fake1Reader extends AbstractReader {

  def read: PartialFunction[Any, Unit] = {
    case readingRequest: ReadingRequest => {
      var reading: Reading = new ReadingImpl(readingRequest.getResourceId, "payload",
        Calendar.getInstance.getTime,
      readingRequest.getfrequency, readingRequest.getMappingName,
        readingRequest.getClassificationType,
      readingRequest.getReadingRequestId)
      sendConsumeMessage(reading)
    }
  }
}

所以为了使用这个函数,我必须提供一个新的 Fake1Reader().read。

有没有更简洁的方法来使用应用或扩展函数或 PartialFunction 来做这个类?

4

2 回答 2

2

如果你AbstractReader是无状态的,你可以定义object而不是class避免在每次使用时创建不必要的对象,并将你的函数作为不可变val的。

此外,伴随对象akka.actor.Actor将 type 定义Receive为 的别名PartialFunction[Any, Unit],因此您可以像这样编写部分函数:

package foo    
object Fake1Reader extends AbstractReader {
  import akka.actor.Actor._

  val read: Receive = { 
    case readingRequest: ReadingRequest => /* implementation */
  }
}

用法:

import foo.Fake1Reader._

actorRef ! HotSwap(read)
于 2011-10-19T18:22:44.983 回答
2

作为旁注,这减少了重复的苦差事:

case readingRequest: ReadingRequest => {
  import readingRequest._
  var reading: Reading = new ReadingImpl(getResourceId, "payload",
    Calendar.getInstance.getTime,
  getfrequency, getMappingName,
    getClassificationType,
  getReadingRequestId)
  sendConsumeMessage(reading)
}
于 2011-10-19T22:50:21.113 回答