优雅的使用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() { }}
- 优雅的使用abstract
- ThreadLocal的优雅使用
- 优雅的使用ViewHolder
- INotifyPropertyChanged的优雅使用
- 优雅的使用mysql
- 优雅的使用optional
- RecycleView的优雅使用
- 优雅的使用DbContext
- 优雅的使用python
- abstract关键字的使用
- 探讨SQLiteDatabase的优雅使用
- 优雅的使用链表
- Optional优雅的使用null
- 如何优雅的使用“看板”?
- 如何优雅的使用 Mac
- 如何优雅的使用EventBus
- 如何优雅的使用 ubuntu
- 如何优雅的使用 win10
- 链表:画图说明问题-
- YII如何隐藏URL中的index.php
- 朴素贝叶斯方法和支持向量机
- SHA-1算法
- HDU-2111-Saving HDU
- 优雅的使用abstract
- Strings
- 坦克大战_坦克移动
- **AJAX** AJAX简介
- 排序
- HDU1506->单调栈
- 自定义HorizontalScrollView(横向滑动的ScrollView)
- Hdu 5452 Minimum Cut (图论问题) 2015 ACM-ICPC沈阳网赛
- Android之Gallery的使用