Java Akka参与者实现:扩展还是注入?

Java Akka参与者实现:扩展还是注入?,java,dependency-injection,akka,subclass,actor,Java,Dependency Injection,Akka,Subclass,Actor,我是Akka的新手(我使用的是JavaLibv2.3.9),我想知道两个相互竞争的参与者实现策略之间的权衡是什么。一方面,我可以以标准方式实施我的演员: …与其这样做,我可以通过注入添加一层抽象: class StarWarsCharacter extends UntypedActor { @Inject // Injected behavior; implementation doesn't matter BehaviorHandler behaviorHadler

我是Akka的新手(我使用的是JavaLibv2.3.9),我想知道两个相互竞争的参与者实现策略之间的权衡是什么。一方面,我可以以标准方式实施我的演员:

…与其这样做,我可以通过注入添加一层抽象:

class StarWarsCharacter extends UntypedActor {
    @Inject // Injected behavior; implementation doesn't matter
    BehaviorHandler behaviorHadler

    @Override
    void onReceive(Object message) {
        behaviorHandler.handle(message)
    }
}

interface BehaviorHandler {
    void handle(Object message)
}

class StormTrooperBehaviorHandler implements BehaviorHandler {
    @Override
    void handle(Object message) {
        // Betray all Jedi, serve the Emperor!
    }
}

class DarthVaderBehaviorHandler implements BehaviorHandler {
    @Override
    void handle(Object message) {
        // Betray the Emperor, save your son!
    }
}

class EmperorBehaviorHandler implements BehaviorHandler {
    @Override
    void handle(Object message) {
        // Transform into your true self!!
    }
}
只有一种类型的参与者并使用不同的
behaviorhandler
实现注入它是否有性能/类加载方面的好处?我不想这样做并使用“标准”actor实现有什么原因吗?

如果您只想使用actor作为向处理程序发送消息的一种方式,那么第二种(非标准)方式就可以了,并且可以在代码结构方面给您带来一些好处-例如,
BehaviorHandler
是一个单一的方法接口这一事实将允许您使用lambda实现它

然而,参与者不仅仅是方法分派者。随着系统复杂性的增加,它们提供了各种各样的方法

典型的中等规模Akka系统需要引用
self
sender
context
,这些都是在
UntypedActor
上定义的

简而言之:如果你不使用继承,那么你放弃的比你意识到的更多。

谢谢@Tim(+1)-配置和调优呢?除了您关于
UntypedActor
API的论点外,如果可以按类型(池大小等)配置参与者,我想这将是“标准”实现的另一个可靠论点……想法?
class StarWarsCharacter extends UntypedActor {
    @Inject // Injected behavior; implementation doesn't matter
    BehaviorHandler behaviorHadler

    @Override
    void onReceive(Object message) {
        behaviorHandler.handle(message)
    }
}

interface BehaviorHandler {
    void handle(Object message)
}

class StormTrooperBehaviorHandler implements BehaviorHandler {
    @Override
    void handle(Object message) {
        // Betray all Jedi, serve the Emperor!
    }
}

class DarthVaderBehaviorHandler implements BehaviorHandler {
    @Override
    void handle(Object message) {
        // Betray the Emperor, save your son!
    }
}

class EmperorBehaviorHandler implements BehaviorHandler {
    @Override
    void handle(Object message) {
        // Transform into your true self!!
    }
}