1、abstract介绍
Java的abstract关键字可以修饰方法,也可以直接修饰类。当我们父类不关心某个方法具体实现时,可以使用abstract修饰该方法,使其成为虚方法。虚方法没有方法体,不需要实现,只需要声明即可。包含虚方法的类称为虚类,虚类也必须使用abstract关键字修饰。虚类除了不可以直接实例化,几乎和普通类没什么区别。继承虚类的子类,必须通过复写实现父类所有的虚方法,或者实现父类部分虚方法同时将自己也声明为虚类。接口(Interface)可以看作一个纯虚类,其所有方法默认都使用public abstract修饰,都是虚方法,其所有成员变量都默认都使用public final static修饰。实现(implements)接口的类,必须复写接口全部方法,否则也必须使用abstract关键字声明为虚类。
2、abstract优雅的使用姿势
假设我们有一个请求监听接口,声明了很多方法。例如:
public interface CallbackListener {
public void start();
public void running();
public void end();
}
现在考虑下面这样的场景:需要为一个请求设置CallbackListener监听器,但是该请求只关心接口中的某一个方法,比如end(),该怎么做合适呢?
- 直接实现接口全部方法
request.setCallbackListener(new CallbackListener () {
@Override
public void start() {
// do not care
}
@Override
public void running() {
// do not care
}
@Override
public void end() {
// to do sth.
...
}
});
这种方式,优点简单粗暴,没什么好说的,但是缺点同样很明显,接口方法越多多余的代码越多。关键是重度强迫症患者受不了啊。。。
- 使用Adapter包装
如果你写过Android动画,肯定需要对动画执行状态进行监控,与Animator.AnimatorListener和Animator.AnimatorPauseListener接口打交道在所难免,但是如果你还在用上面那种方式设置监听器,那就太low啦。android sdk已经为我们包装好了一个AnimatorListenerAdapter类,实现了上述两个接口,复写了全部方法,但是方法体都留空。使用时,我们只需要继承AnimatorListenerAdapter,选择需要监听的状态对应的方法进行复写即可,而不用再为不关心的状态写一大堆空实现了,代码看上去会舒服很多。按照这种思路,我们可以编写一个CallbackListenerAdapter类。
public class CallbackListenerAdapter implements CallbackListener {
@Override
public void start() {
}
@Override
public void running() {
}
@Override
public void end() {
}
}
现在,我们使用CallbackListenerAdapter设置监听就会简洁很多。
request.setCallbackListener(new CallbackListenerAdapter(){
@Override
public void end() {
super.end();
}
});
Android中其实还有很多类似的实现,比如ViewPager的SimpleOnPageChangeListener、GestureDetector的SimpleOnGestureListener等。
- abstract Adapter
使用Adapter方式实现已经比较完美了,我们为监听器提供了默认的实现,子类只需选择相应的方法进行复写即可。但是稍微有点瑕疵:
(1)当我们在new一个Adapter时,IDE不再会像new一个虚类或者接口一样,提示需要复写的方法供我们选择,帮我们自动生成一些代码,我们需要明确知道自己应该复写哪个方法,然后去手动复写。可是,我就是很懒怎么办,代码能少敲一行也是极好的。
(2)鉴于没有IDE提示,我们可能不小心new一个Adapter默认实现就做为参数了,然而这并没有什么意义。
这时候,abstract Adapter就可以派上用场了。我们知道包含abstract method的类必须声明为abstract类,那么不包含abstract method的类可以使用abstract修饰吗?答案是肯定的,即使不包含abstract method的类也可以使用abstract修饰,abstract关键字标识着这个类是虚类,你必须至少复写它的一个方法才可以实例化。AnimatorListenerAdapter类其实就是这样实现的。利用这个原理,我们可以创建abstract Adapter,在拥有Adapter功能的同时,IDE也会为我们做代码提示,一定程度上也防止了使用默认实现作为参数。
public abstract class CallbackListenerAdapter implements CallbackListener {
@Override
public void start() {
}
@Override
public void running() {
}
@Override
public void end() {
}
}

本文探讨了Java中抽象类和适配器模式的应用,详细介绍了如何使用abstract关键字定义抽象方法和类,以及如何通过适配器模式简化接口实现过程。
1032

被折叠的 条评论
为什么被折叠?



