java - 为什么使用 javabean 绑定(bind)属性而不是事件?

标签 java properties components javabeans

绑定(bind)属性的意义到底是什么?对我来说,它们似乎是使用 EventObjects 的事件类型安全性较低的版本 - 对 event.getPropertyName() 使用字符串相等性检查似乎有点弱。

为什么要用一个而不是另一个?

最佳答案

Java Bean 的全部意义在于系统(尤其是 GUI Builder)可以检查 Java Bean 并对其进行配置,而无需事先了解该组件。

虽然这很酷,但它真的只在这种特定情况下有用,而且现在注释会工作得更好。

所以他们使用绑定(bind)属性的原因仅仅是为了支持这种插入式 GUI 组件技术,除非您需要支持反射式 gui 构建系统,否则我不会真的更喜欢它而不是事件。

对@Mike rodent 的回应

假设您允许用户创建一个由您控制的类。这个类有一个“Main”,可以处理几个事件。

通常你会让你的用户做这样的事情:

class UserClass(someClass) {
    void mainMethod() {
        someClass.addEventListener(new EventListener() {
            public void eventsHappen(Event e){
                    event1(e)
                }
            }
        }
        someClass.addDifferentEventListener(new DifferentEventListener() {
            public void eventsHappen(DifferentEvent e){
                    event2(e)
                }
            }
        }
    } 

    public void event1(Event e) {
        //java code for event 1
    }
    public void event2(DifferentEvent e) {
        // java code for event 2
    }
}

无论如何,你明白了。当然,您假定此类已在某处注册——可能在 xml/config 文件中。您读取它、实例化它并执行 mainMethod(由协议(protocol)或接口(interface)定义),它会自行注册并开始调用事件处理程序。

下面是您如何使用注释完成相同的事情:(您可能认识到这种模式——这几乎就是 Junit 注释测试的方式。)

class UserClass() {
    @Event1
    void event1Method(Event e) {
        event1's code
    }
    @Event2
    void event2Method(AnotherEvent e) {
        event2's code
    } 
}

这更加直截了当,删除了大部分样板文件,还消除了对协议(protocol)或接口(interface)的需要,注释定义更明确且独立。 (如果您关心检查传递给方法的参数,您实际上什至不需要事件注释,但龙在那个大方向上)。

您仍然需要在某处注册该类,但这次您只需扫描每个方法以查找您的事件注释并自己注册它们。既然读取和处理这样一个类只需几行代码,为什么要将此模式限制为单元测试?

另一件我发现非常巧妙的事情是,我将这种模式用于“插入”到我的 Java 程序中的 Groovy 类。因为我无论如何都要编译给定目录中的所有类,扫描注释是微不足道的。对用户的影响是他放入(或编辑)一个正确注释的 groovy 文本文件,我的代码立即编译、集成并开始调用他们的事件处理程序。

关于java - 为什么使用 javabean 绑定(bind)属性而不是事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2319926/

相关文章:

java - 无法从 C 代码对 Java getter 进行 JNI 调用

java - 如何将字母倒过来?

properties - Swift 类 : Property not initialized at super. init 调用中出现错误

c# - 属性 setter 的 Visual Studio DebuggerStepThrough

Angular 2 : How to dynamically create ViewContainerRef

java - Android 如何处理 Android 中的背景图像?

java - 使用 fragment 中的自定义适配器和自定义行过滤 ListView

java - 动态注入(inject) map

c# - 找不到引用组件 Microsoft.CSharp

components - Sparx Enterprise Architect (EA) 中的嵌套组件