EffectiveJava之16-★接口優於抽象類

1、 Mixin(混合類型):一個類出了實現它的“基本類型”之外,還可以實現這個mixin類型,以表明他提供了某些可供選擇的行爲。---用接口來定義,抽象類不能。

2、 他允許可選的功能被混合到一個類型的基本功能中。

3、 接口可以是我們構造出非層次結構的類型框架但有些事物不能整齊的組織成一個嚴格的層次結構。 比如 歌唱家 和 作曲家。

Public interface Singer{   --- Sing(Song s);}

Public interface SongWriter{   --- compose(Song s);}

 新的接口: publicinterface SSW extends Singer,SongWriter{---XXX();}

  另一個做法是:寫個膨脹(bloated)的類層次,對於每一種要被支持的屬性組合,都包含一個單獨的類。如果在整個類型系統中有N個屬性,則共有2^N 種可能組合有帶提供支持---------------------組合爆炸(combinatorialexplosion)。

4、接口的作用時定義類型,但 骨架實現類 的實現類負責所有與借款單實現相關的工作。

                                                        ||||

       把接口和抽象類的優點結合,對於每個期望導出的重要接口都提供一個抽象的骨架實現類。       ------------------------AbstractInterface如:AbstractSet AbstractList………

4、 骨架實現類 有助於接口的實現。 實現了這個接口的類可以把對於接口方法的調用,轉發到另一個內部私有類的實例上,而這個內部私有類擴展了骨架實現類。---模擬多重繼承(包裝類模式有關係)。    

骨架類實現的編寫:

研究接口,確定最爲基本的(primitive)方法,其他方法在實現的時候以他們爲基礎。這些方法殭屍骨架實現類中的抽象方法。然後必須對接口中所有其他的方法提供具體的實現。

比如  :   Map.Entry 接口

       Public abstract class AbstractMapEntryimplements Map.Entry{

//primitives

Public abstract Object getkey();

Pbulic abstract Object getValue();

 

//Entries in  modifiable maps must overridethis method

Public Object setValue(Object value){

throw new UnsupportedOperationException();

}

 

//implements the general contract of Map.Entry.equals

Public boolean equals(Object o){

   If( o == this)

        Returntrue;

   If(!(oinstanceof Map.Entry))

        Returnfalse;

   Map.Entry arg= (Map.Entry) o ;

        Return eq( getKey() , arg.getKey())&&eq(getValue() , arg.getValue());

}

Private static boolean eq(Object o1 , Object o2 ){

        Return(o1 == null ? o2 == null : o1.equals(o2));

        }

//Implements the general contract ofMan.Entry.hashcode

      Public inthashCod(){

                 Return

                      (getKey() == null ? 0: getKey().hashCode())^

                      (getValue() == null ?0: getValue ().hashCode());

              }

}

 

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