Events Java需要建议

Events Java需要建议,events,design-patterns,lambda,observer-pattern,java-8,Events,Design Patterns,Lambda,Observer Pattern,Java 8,我正在设计一个小型的库,有时我会写几行代码,但感觉不太对劲,所以我想听听一位经验丰富的java程序员的意见/建议 我有一个监听器处理3个不同的事件,在我的一个类中,我实现了实际触发事件的方法 所以我一开始是这样做的: protected final void fireOperationStarted(){ OperationEvent event = new OperationEvent(this); for (OperationListener listener : li

我正在设计一个小型的库,有时我会写几行代码,但感觉不太对劲,所以我想听听一位经验丰富的java程序员的意见/建议

我有一个监听器处理3个不同的事件,在我的一个类中,我实现了实际触发事件的方法

所以我一开始是这样做的:

 protected final void fireOperationStarted(){
     OperationEvent event = new OperationEvent(this);

    for (OperationListener listener : listeners) {
        listener.operationStarted(event);
    }
}


protected final void fireOperationEnded(){
    OperationEvent event = new OperationEvent(this);

    for (OperationListener listener : listeners) {
        listener.operationEnded(event);
    }

//omitted the 3rd method on purpose
但是这段代码感觉是错误的,因为如果有人想要实现他们自己的事件,他们基本上需要访问整个侦听器arraylist(CopyOnWriteArraylist)并反复编写逻辑

因此,我选择的是一个具有单一方法“fire”的Fireable接口。这就是我所做的:

protected final void fireOperationStarted(){
fireOperation(new Fireable(){

    @Override
    public void fire(OperationListener listener, OperationEvent event) {            
        listener.operationStarted(event);
    }

});
}

 protected final void fireOperationEnded(){
fireOperation(new Fireable(){

    @Override
    public void fire(OperationListener listener, OperationEvent event) {            
        listener.operationEnded(event);
    }

});
}

protected void fireOperation(Fireable fireable){

    OperationEvent event = new OperationEvent(this);

    for (OperationListener listener : listeners) {
    fireable.fire(listener, event);
    }
}
我想听听你的意见,我个人认为它比第一个实现要好,即使还有很多样板代码。也许有更好的办法?我查看了java.awt.events包的源代码,以了解它们是如何处理多个事件的,以及它们是如何触发这些事件的,但对于我的需要来说,这似乎太复杂了

我还想知道的一件事是关于Java8中的lambda表达式,如果我使用它们而不导入任何Java8包并进行编译,它会在JRE7上工作吗

使用JDK8使我的代码最终变得更干净可能会很棒


谢谢你的帮助

我认为你的第一个例子更好<代码>侦听器必须是一个实例字段,因此每个人都可以随时使用

(您可能在OperationListener中只有一个方法,并在OperationEvent中使用一个值来确定所涉及的操作。然后,您的方法都可以将适当的事件传递给调用one listener方法的一个方法。)

您的第二个想法很有趣,但对于在一个类的一个实例中使用,我认为这太过分了

有各种各样的方法来存储侦听器。如果添加和删除它们的速度不太快,ArrayList就很好了。如果有机会在不同的线程上添加和删除它们,并且您经常调用侦听器,CopyOnWriteArrayList会更好

不要太担心“样板”。Java倾向于使用冗长但简单的底层代码。第一个示例中的两个
for
循环需要以某种方式进行组合,但在获得更多循环之前,不值得担心


Lambdas会减少代码行数(如果使用简单的代码行,我的C#Lambdas最终都会运行20行或更多代码行;也可能是匿名类!),但它们会在语言手册中添加大量页面。然而,lambda直到JRE 8才出现。

对于您关于lambda的问题:不,实现它们涉及到对编译器、VM以及库的更改。您需要一个JRE 8来执行它们。但是-我知道这一点,但是对于其他访问此问题的人来说-实际上现在有一个到Java 5-7的lambda表达式的后端口: