Java学习笔记(事件,内部类)

来源:互联网 发布:mac qq不能截图 编辑:程序博客网 时间:2024/05/28 15:20

         Java目前来讲不支持委托,就是方法的回调.而要达到这种功能,需要用到对象回调.虽然Java提供了匿名对象可以在一定程度上简化事件处理对象的编写,但由于一些接口方法很多,如果用命名对象或者匿名对象来处理事件的话,就需要实现这个事件接口的所有方法,而大多时候其实只需要实现其中某个或某几个方法就可以,采用直接实现接口的方式就会增加工作量,接口一多还会使得事件接口处理编程看起来很混乱,很复杂,因此用事件适配器,给接口一个默认实现,用户的事件再从这个适配类继承,在继承类中只要实现需要的方法即可,而不需要实现所有的方法,这可以简化事件处理代码.另外一个好处就是可以起到"适配模式"的好处.通过这个适配可以将事件接口和事件具体的处理者分离,原因是事件的接口一般处在更抽象的层次上,一般是比较固定的,而事件的处理者一般处在具体层上,具体的处理者的调用接口并不一定符合事件触发者调用所需要的事件接口描述,因此通过一个适配器类来中转这种调用,可以提供更好的灵活性和可扩展性,也可以提高代码的复用。比如按钮的点击处理,按钮点击后的处理代码有自己的调用接口,但按钮的点击事件的触发可以是鼠标点击,也可以是处于焦点下的回车事件来触发。

         采用适配器方法,好处很多,但也有一个不伤大雅的缺点是容易产生不易察觉的错误,产生这个错误的根本原因是Java的继承中的虚方法和覆盖方法都没有关键字,而java是大小写敏感的,这样就很容易写错覆盖的方法.

         Java的内部类是一个很有意思的东西,它不属于外部类,而是属于外部类的实例,这跟C#的内部类不一样。C#的内部类与外部类的不同仅仅在于访问权限。内部类可以直接访问外部类的成员,通过外部类名SomeClass.this就可以访问外部类当前实例.静态内部类不属于外部类的实例。因此不能调用外部类的实例方法。普通内部类的机制,在实现线程安全方面会提供很多便利.很容易形成一个实例协作对象集合.因此Java事件的处理类一般采用内部类会比较好.

         在Java中,除了私有和final类型的方法都是虚方法,可以在子类中覆盖.虽然这种方式可以少用两个关键字,但做为强类型的语言,这对程序员来说是不利的,很容易导致不必要的错误,程序员自己很难区分是覆盖和重载的,而且由于大小写是敏感的,这也会导致覆盖父类方法的困难.很多时候,公共方法也不代表就是虚方法,明确一个方法是否是虚方法,可以交给程序员自己完成,这样也可以增加代码的安全性.虚模式在很多时候可以用来替代部分面向方面编程的功能,是一种常用的设计模式,但在Java中很难实现这种模式(虚模式在我前面的博文中有介绍).
         在事件的处理机制上,我还是希望Java在以后的版本中能支持委托类型,这样不仅可以简化事件代码的书写,也有利于多个类之间的事件交互.减少不必要的接口实现.