4个字概括就是"流程封装".
定义, 以及为什么要使用final 方法.
开发中经常能碰到有些操作的执行步骤是固定的, 但每一个步骤的实现可以是多样化的, 例如ImageLoader提供的loadImage(url, listener), 步骤是从网上获取图片, 缓存图片, 把图片设置给listener.
这种情况下, 就可以把ImageLoader抽取出一个抽象类AbsImageLoader, 把loadImage()定义为final, 这样子类就不可以去修改loadImage(), 只能去修改每个步骤的实现细节. 通过这种方式, 执行的流程就被固定下来了.
public class AbsImageLoader {
public final void loadImage(String url, Listener listener) {
onRequest(url);
saveToCache(Bitmap bitmap);
listener.onReceiveBitmap(bitmap);
}
public abstract void onRequest(String url);
public abstract void saveToCache(Bitmap bitmap);
}
源码中的使用
最典型的是AsyncTask提供的execute()就被声明为final类型.
public final AsyncTask<Params, Progress, Result> execute(Params... params)
在execute()方法内部封装了onPreExecute, doInBackground, onPostExecute这个逻辑流程,客户可以根据自己的需求再覆写这几个方法, 但因为execute是final方法,这样就可以保证AsyncTask中的执行流程是固定不变的.
阅读代码时, 经常看到有些抽象类中的方法声明为final, 有很多就是出于"封装固定流程"的目的才用到了final关键字.
--------DONE.--------------------
网友评论