Java需要建议

时间:2013-07-05 04:10:17

标签: events design-patterns lambda observer-pattern java-8

我正在设计一个小型库,有时我写了几行,感觉不对,所以我想得到一个经过实验的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包源代码,了解它们如何处理多个事件以及它们如何触发它们,但它似乎对我的需求来说太复杂了。

我想知道的一件事是关于Java 8中的lambda表达式,如果我使用它们而不导入任何Java 8软件包并且我编译,它是否可以在JRE7上运行?

最好使用JDK8让我的代码更干净。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我认为你的第一个例子更好。 listeners必须是一个实例字段,并且每个人都可以随时使用。

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

你的第二个想法很有意思,但是对于在一个班级的一个实例中使用,我认为这太过分了。

存储侦听器的方法各不相同。如果你没有太快地添加和删除它们,ArrayList是好的。如果有可能在不同的线程上添加和删除它们并且你经常调用监听器,那么CopyOnWriteArrayList要好得多。

不要过于担心“样板”。对于低级代码,Java倾向于单调而简单。你的第一个例子中的两个for循环要求以某种方式组合,但是在你有更多批次之前不值得担心。

Lambdas将减少你的代码行(如果你使用简单的代码;我的C#lambdas最终都运行20行或更多;也可能是匿名类!),但他们会在语言手册中添加大量页面。但是,在JRE 8之前,lambda不存在。