为什么使用javabean绑定的属性而不是事件?

为什么使用javabean绑定的属性而不是事件?,java,properties,components,javabeans,Java,Properties,Components,Javabeans,绑定属性的意义到底是什么?在我看来,它们似乎是使用EventObjects的事件的类型不太安全的版本——对event.getPropertyName()使用字符串相等性检查似乎有点弱 为什么要使用一个而不是另一个呢?JavaBeans是一种规范。它将绑定属性定义为其修改导致发出通知的属性,而PropertyChangeEvent是受认可的通知实体 因此,假定的JavaBeans规范bean编辑器应该侦听PropertyChangeEvents。除了需要使用该规范之外,我自己也不会使用它。我认为J

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


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

JavaBeans是一种规范。它将绑定属性定义为其修改导致发出通知的属性,而PropertyChangeEvent是受认可的通知实体


因此,假定的JavaBeans规范bean编辑器应该侦听PropertyChangeEvents。除了需要使用该规范之外,我自己也不会使用它。

我认为JavaBeans规范的设计考虑了通用对象处理。例如,将JavaBean放入IDE中并使用可视化属性编辑器对其进行配置。在这种情况下,IDE将使用general PropertyChangeEvent等

或者,如果您想将同名属性从一个bean复制到另一个bean。。。这是bean使用的另一个例子(BeanUtils类)


但是,如果你打算做一些特定的事情,正如Noel Ang所说,我建议你使用强类型。

Java Bean的全部要点是,系统(尤其是GUI构建器)可以检查Java Bean并对其进行配置,而不必事先了解该组件

虽然这相当酷,但它实际上只在这种特定情况下有用,而且现在注释的效果会更好

因此,他们使用绑定属性的原因仅仅是为了支持这种嵌入式GUI组件技术,我并不真正喜欢它而不是事件,除非您需要支持反射式GUI构建系统

对@Mike啮齿动物的反应

假设您允许用户创建一个您将控制的类。这个类有一个“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 } } 类UserClass(someClass){ void main方法(){ addEventListener(新的EventListener(){ 公共无效事件Shappen(事件e){ 事件1(e) } } } AddDifferentiteEventListener(新的DifferentiteEventListener(){ 公共无效事件Shappen(不同事件e){ 事件2(e) } } } } 公共无效事件1(事件e){ //事件1的java代码 } 公共无效事件2(不同事件e){ //事件2的java代码 } } 无论如何,您都明白了。当然,您假设这个类是在某个地方注册的——可能是在一个xml/config文件中。您读取它,实例化它并执行main方法(由协议或接口定义),然后它注册自己并开始获取对事件处理程序的调用

现在,您可以通过注释实现同样的功能:(您可能会认识到这种模式——这与Junit注释测试的方式非常相似。)

类UserClass(){ @事件1 无效事件1方法(事件e){ 事件1的代码 } @事件2 无效事件2方法(另一个事件e){ 事件2的代码 } } 这是更直接的,并且删除了大部分样板文件,也消除了对协议或接口的需要,注释的定义更加清晰和独立。(如果您想检查传递到方法中的参数,实际上甚至不需要事件注释,但是龙就在这个方向上)

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


我发现另一件事非常巧妙,我使用这种模式来处理“插入”到Java程序中的Groovy类。因为我编译了给定目录中的所有类,所以扫描注释是很简单的。对用户的影响是他插入(或编辑)正确注释的groovy文本文件和我的代码会立即编译、集成并开始调用它们的事件处理程序。

我对您关于注释的评论很感兴趣:您是否可以提供一个链接或简要解释注释如何用于事件处理? class UserClass() { @Event1 void event1Method(Event e) { event1's code } @Event2 void event2Method(AnotherEvent e) { event2's code } }