接口小结

写在前面

最近对于接口的应用也算比较多吧,所以来总结一波我对于接口的使用和感悟。

比抽象类更加抽象

说到接口,就不得不提抽象类了。这二者有很多相似和很多不同的地方,但是要我说这二者最大的不同,就是标题了:接口比抽象类更加抽象。这个结论通常情况下都是成立的,除非你的抽象类什么都没……但是一般情况下你也不会弄这么个没意义的抽象类。一般来说在设计抽象类时都会考虑到这个抽象类应当实现什么功能和恰当的设计其抽象方法,前者是此抽象类的意义,后者通常是交给使用者去实现其需要的具体的功能。接口则不然,他只需要考虑一个类实现了这个接口的类“是怎样的”,需要我们做的就是恰当的设计一个接口该拥有哪些方法(这一点在java8之后略有不同,因为接口方法可以有默认的实现了),并不需要在接口里去具体的实现。从这一点看来接口比抽象类更加的抽象。

另外抽象类还有一个使用的技巧——防止类被实例化,这一点在《Thinking in java》中亦有提及,因为接口和抽象类都不能被实例化。这点是个概念问题,我们代码中看起来是实例化接口或者抽象类,实际上都是用的一个匿名类的对象。

解耦利器

使用接口非常重要的一点就是:解耦。

在平时写代码的时候我们都会不自觉的敲出如下代码:

List<String> list = new ArrayList<>();

前面的List便是一个接口,在实现相应的方法的时候,我们也会将参数尽可能的写成其接口。这使得我们的代码不依赖于具体的数据类型,只要是List的实现类即可。在这个角度看来,其的确实现了代码的解耦。

在Java中,回调大多是用接口来实现的,结合一个android中的实例来做一些更加深入的思考:

view.setOnClickListener(new OnClickListener(){
      @Override
      public void onClick(View view){
      //........
      }
});

这是android种一个典型的回调的例子。OnClickListener是一个接口,在view的内部会持有一个OnClickListener的引用,在你设置了这个OnClickListener之后,如果有点击事件发生,会回调这个接口方法。这是回调简单的流程概述,那么再深入思考一下,这种形式不能用调用类的方法来实现么?

答案当然是可以,首先你要理解一点:接口是不会干活的(恩,还是先将java8排除在外好了)。当我们在设置OnClickListener的时候,我们是通过匿名内部类来实现了一个接口。回调可以分成两个角度来叙述,首先从系统角度来说,回调是一些特殊事件发生时(比如点击事件),我会通知你我这事发生了。从我们开发者角度来说,就是我希望能在特殊事件发生时(点击事件),我能有一个方法来做一些事(响应客户端的点击事件)。那么在实现的时候我们就可以在对应的位置调用一个方法(通常是空方法),然后让开发者实现这个方法不就万事大吉了么?事实上也是如此,就算不用接口我们用一个带方法内容为空的类来试试。

public class OnClickListener {
   public void onClick(String s){};
}

上面的代码可以清晰的看出这是个类,只不过我起的名字是那玩意。接下来看具体的实现,为了方便我都写了静态方法,就不用再写第三个类了:

public class A {

   public static OnClickListener listener;
 
   public static void setOnClickListener(OnClickListener listener){
    A.listener = listener;
   }
 
   public static void click(){
    //这个方法代表被点击了
    System.out.println("被点击了");
    listener.onClick("被点击了--->回调发生了");
   }
 
 
   public static void main(String[] args){
      setOnClickListener(new OnClickListener(){
         @Override
         public void onClick(String s){
            System.out.println(s);
    
         }
      });
      click();
  
   }
}
回调.png

由上可见,类也能实现回调,只要用户重写相应的方法就行了。事实上接口不也是如此么?只不过我们将重写接口方法称作实现罢了。

以上其实我觉得并不能全算为接口的功劳,这些解耦的功劳** 多态 ** 能分一半。

多继承 & 协议

Java中没有多重继承,只是单继承,但是利用接口,我们可以变相的实现多继承。还是刚才android中经典的例子,我们有时为了点击事件的统一编写,可能会这么干:

setOnClickListener(this);

这个this就是我们的Activity或者其他的玩意,那么我们可以思考一下,这时的Activity既是Activity某个父类的子类,也是OnClickListener类。

回到刚开始所说的,接口的特性是啥?就是实现这个接口的类“看起来都是这样的”,有没有一种很熟悉的既视感?是了,我们常用的数据格式json、xml不都是“看起来都是这样的”么,只要是符合规范和双方协定的json或者xml,不管其具体内容是什么,我们都可以解析和使用。那么在设计和实现接口时也应当如此。比如Java集合框架的Collection接口就约定在实现boolean add(E e)方法时,如果拒绝添加一个元素应当抛出一个异常而不是返回false。当我们需要自己实现一个Collection接口的类时应当遵循这些约定,不然其他遵循这些约定而设计的方法可能会不适用于你的类。

以上是基于设计方面的一些小结,事实上我们并没有多少机会去设计接口……通常我们实现的接口都是用来被回调的,也就是实现某个功能而已。但是咋说呢,多了解点,让眼界开阔点也好。

最后觉得我好像该去看看设计模式了……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,846评论 25 707
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,602评论 18 399
  • 许多著名画作中的阴影一般都不用黑色。黑色的色彩强度能够压倒其他色彩。黑色会非常的突出,因为自然界没有真正的纯黑,日...
    7daa7a6fa589阅读 1,046评论 0 0
  • 一.传统的开发模式 基于mvc模式进行项目开发;基于mvc的项目框架结构:Entity / dao/service...
    Mr_欢先生阅读 766评论 0 10
  • 我喜欢忙碌 忙碌起来就忘了思念 忙碌就像带发条的钟 我是秒针 为了能够与你相遇 我一次又一次地循环 心里默念下...
    9076d741dbf6阅读 106评论 1 1