2016-06-17 10 views
1

Ich möchte eine globale Variable deklarieren, wenn ein Actor eine Nachricht erhält, hier ist mein Code, es funktioniert. F: Kann ich das mit unveränderlichen Variablen erreichen?Scala akka: deklariere eine globale Variable in der Empfangsfunktion

case class Start(configs:JobConfig) 
trait Job extends Actor with ActorLogging { 
    //use "val" instead 
    private var confMap:Map[String,String]=Map() 
    def receive = { 
    case Start(conf) => { 
     confMap = conf.properties 
     init() 
    } 
     case x => log.debug("Got: " + x) 
    } 

    final def getProperties():Map[String,String]={ 
    confMap 
    } 

    def init() 

} 

Antwort

1

Natürlich können Sie, aber wenn Ihr init Verwendung confMap sollte es eine Karte als parametr nehmen:

... 
def receive(confMap:Map[String,String] = Map()) = { 
    case Start(conf) => 
    init(conf.properties) 
    context.become(receive(conf.properties)) 
    case ... 

können Sie weitere Informationen finden here

+0

Vielen Dank für Ihre aswer. Aber wie confMap in anderer Funktion zu verwenden? Ich weiß nicht, welche Funktion confMap verwenden wird, das ist der Hauptgrund, warum ich eine globale Variable deklariere. –

+1

Wenn Sie globale Variablen verwenden, produziert es Nebenwirkung. Es wird schwierig oder manchmal unmöglich, Ihre Funktionen isoliert zu testen. Also, ich denke, alle Ihre Funktionen sollten 'confMap' als Parameter verwenden oder Sie können eine Klasse erstellen, die Configs als Parameter akzeptiert und über alle Methoden verfügt, die Sie benötigen, und sie im 'receive'-Parameter verwenden. –

+0

Ich habe es. Vielen Dank –