2011-10-19 47 views
0

我正在使用akka庫並提供部分函數,​​以便在運行時通過熱插拔由actor執行。如何定義更簡潔的scala函數

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。

是否有更簡潔的方式來使用apply或extends Function或PartialFunction來完成這個類?

+0

對不起,我不明白問題。你能否詳細說明/完善? –

+0

通過調用變量'r'而不是'readingRequest',可以減少約30%。 –

回答

2

如果您AbstractReader是無狀態的,你可以定義object代替class,避免每次使用不必要的對象的創建,並有把你的功能不變val的。

此外,同伴對象akka.actor.Actor定義爲PartialFunction[Any, Unit]別名鍵入Receive,所以你可以寫你的部分功能如下:

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

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

用法:

import foo.Fake1Reader._ 

actorRef ! HotSwap(read) 
+0

這是一個非常高的併發應用程序,我最初定義爲具有單一功能的對象並切換到類。我擔心有很多演員訪問同一個對象的單身事物​​。 –

+0

真的,我在尋找的是類定義實際上是功能,不知道它是否可能。 –

+1

如果它不可變/無狀態,那麼任何共享都不是問題。如果您認爲自己會遇到性能問題,那麼確實有一個(或者模擬其中一個條件),然後衡量實際的開銷可能會有所幫助。 –

2

作爲一個方面說明,這減少了重複性的繁重工作:

case readingRequest: ReadingRequest => { 
    import readingRequest._ 
    var reading: Reading = new ReadingImpl(getResourceId, "payload", 
    Calendar.getInstance.getTime, 
    getfrequency, getMappingName, 
    getClassificationType, 
    getReadingRequestId) 
    sendConsumeMessage(reading) 
}