讀書筆記-Effective Java之骨架實現類

前言:

        在閱讀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

總結:對於一些接口的公共方法,可以通過骨架實現類去實現,從而子類無需再去實現公共方法。如果接口中的一些方法子類不需要,這種情況在子類直接實現接口的時候無法解決,因爲子類必須實現接口中的所有方法。但是有了骨架實現類,我們可以使用骨架實現類去提供默認實現,子類在繼承的時候不再去重寫該方法,從而更關注那些需要的功能。

總結:骨架實現類作爲實現類和接口的中間類,可以提一些公共方法的實現,避免重複代碼,同時可以自定義特殊方法拓展子類功能,可以提供特殊方法的默認實現,使子類更關注於自身需要的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章