前言:
在閱讀Effective Java時,第18條接口優於抽象類,其中提到了骨架實現類AbstractInterface,其中的interface表示接口的名稱,例如在Conllection接口中有很多的類似設計,AbstractSet,AbstractList等等。
在閱讀的時候,對這個概念一知半解,百度一波資料之後,加上自己的理解,算是明白了一點,記錄下來,方便以後翻閱。
先來闡述幾個概念:
1、接口:定義了一組方法的集合;其實現類必須要實現接口內的方法,java8之後爲接口提供了缺省方法,解決了在爲接口添加方法的時候,實現類必須添加實現才能編譯通過的問題。
2、抽象類:定義了子類的通用特性;
3、骨架實現類結合了二者的優點,他既是抽象類,同時實現了上層接口。
一個接口可能有很多個實現類,如果每個實現類都直接去實現接口的時候,每次我們都需要去重寫接口的方法,這會造成很多的重複勞動,比如:接口DemoInterface,他包含一個add方法。他又兩個實現類 Demo1和Demo2,這兩個實現類都必須去分別實現add方法。
public interface DemoInterface {
public void add();
}
public class Demo1 implements DemoInterface{
@Override
public void add() {
System.out.println("this is add");
}
}
public class Demo2 implements DemoInterface{
@Override
public void add() {
System.out.println("this is add");
}
}
如果DemoInterface接口又很多方法呢?那每個實現都必須重複去實現。
因此,我們可以設計一箇中間類來實現該接口,同時實現其公共方法。
public abstract class middleClass implements DemoInterface{
@Override
public void add() {
System.out.println("this is add");
}
}
這樣,以後想擁有add 方法的類直接去繼承該骨架類就可以了。
public class Demo1 extends middleClass{
}
public class Demo2 extends middleClass{
}
我們來看看測試結果:
public class TestDemo {
public static void main(String[] args) {
Demo1 d1=new Demo1();
d1.add();
Demo2 d2=new Demo2();
d2.add();
}
}
==============================================================================
this is add
this is add
總結:對於一些接口的公共方法,可以通過骨架實現類去實現,從而子類無需再去實現公共方法。如果接口中的一些方法子類不需要,這種情況在子類直接實現接口的時候無法解決,因爲子類必須實現接口中的所有方法。但是有了骨架實現類,我們可以使用骨架實現類去提供默認實現,子類在繼承的時候不再去重寫該方法,從而更關注那些需要的功能。
總結:骨架實現類作爲實現類和接口的中間類,可以提一些公共方法的實現,避免重複代碼,同時可以自定義特殊方法拓展子類功能,可以提供特殊方法的默認實現,使子類更關注於自身需要的方法。