我所教授的,并因此限制,是将对象作为处理程序传递。我在Java和Objective-C编程项目中都使用过这种方法,并且它可以工作。
但是,我偶然发现了一个框架,它将一个类注册为处理程序,而不是一个对象。我希望这个框架是开源的,所以我可以看到它是如何工作的,但它不是:/。
小心!注册课程后,我实现非静态方法来处理事件。如果它们是静态的,很明显它是如何工作的,我真的很讨厌这种方法。
所以,这些是我的问题:
<小时/> 我的意思是对象处理程序:
爪哇:
button.addActionListener(handlerObject);
班级处理人员的意思是:
爪哇:
object.addCrazyHandler(MyHandler.class);
答案 0 :(得分:3)
Java(不确定Objective-C)允许您通过Reflection API对对象及其类进行内省,因此Object.getClass()
方法和Class上的所有方法。您不仅可以找到类的所有构造函数,方法,字段,实现的接口和超类,还可以调用它们(虽然它比直接调用慢):newInstance()
在构造函数上,invoke()
on字段上的方法get()
或set()
。例如(省略异常处理程序),通过Reflection:
Object o = SomeClass.class.getConstructor().newInstance();
许多框架使用此方法:例如,TestNG或JUnit等测试框架使用它来实例化测试类。使用XML配置时Spring也是如此。
在你的情况下,我认为框架想要控制处理程序的生命周期,如果你为它提供一个实例,它就不能控制它。另一种选择是它采取工厂的实例,但这可能是限制性太强。这也意味着要编写更多的样板代码,当它可以轻松创建对象本身时。