Java:过滤掉重复的事件

标签 java events filter callback

我想知道在接收回调/事件时,以下内容对于“常规”Java 应用程序是否常见。这些回调可能由用户输入触发,也可能由其他方式触发,因此它不仅与 UI 事件相关:

public void handleEvent( @NotNull final SomeEvent e ) {
    final boolean process;
    synchronized ( this ) {
        process = !e.equals(filter);
        filter = e;
    }
    if ( process ) {
        ...   
    }
}

基本上在一些复杂的方案下(非常复杂的 UI 涉及同一模型的多个 View ,并且用户可以在其中从不同的屏幕修改模型 [例如在复杂的 3D 程序中])我有很多事件触发并且我已经注意到我可以使用上面的代码片段过滤掉重复的事件。如果一个事件已被处理并且下一个事件与上一个处理的事件完全相同(保存在 filter 引用中),那么该事件/回调将被简单地忽略。

它工作正常。我想知道过滤掉重复事件是否是一种常用技术?

最佳答案

并非总是如此,但通常这可能表明事件级联链的某些元素未正确检测到它们不需要发送事件。经典示例是一个 bean setter,它即使在值未更改时也会生成 PropertyChangeEvent。

虽然您所做的将过滤掉这些事件,但它并没有解决可能是根本性的潜在问题。

问题是这些“错误”可以组合形成无限循环。扩展上面的 bean 示例,假设您有一个 UI,它根据该 bean 字段重置其可编辑值……并且重置 UI 值也将调用 bean setter,因为那里也没有进行适当的重复检查。第一次编辑值会死循环。

这些例子在发生时很明显,但随着通知层次结构变得越来越复杂,追踪这些事情变得越来越困难,而且它们可能会在更多的间歇时间发生。

一个好的经验法则是让每个事件生成组件尽可能保守。如果(呵呵)您收到来自您无法控制的组件的通知,并且将转发您自己的事件,那么像您设置的过滤器这样的过滤器可能是防止可能更大的传播的唯一选择问题不仅仅是性能。

关于Java:过滤掉重复的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2344953/

相关文章:

java - 集合的 Gson 属性名称

javascript - 即使没有人在听,JavaScript 事件是否也总是执行?

javascript - 将事件监听器附加到类以监听来自其成员的事件

Spring Security 自定义身份验证过滤器和授权

javascript - 你如何比较 javascript 中两个不同大小的数组的值(不是索引)?

javascript - 过滤嵌套数组 - javascript

Java排序数据结构

java - testng 套件第二次测试失败 -> nullpointerexception

c# - 如何订阅从 C# 中的任何集合元素触发的事件?

java - JFormattedTextField,接受值[0.1, 100],数字书写不舒服