优雅的使用abstract

来源:互联网 发布:王思聪大骂林更新知乎 编辑:程序博客网 时间:2024/05/11 15:35

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() {    }}
0 0