<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    人在江湖

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      82 Posts :: 10 Stories :: 169 Comments :: 0 Trackbacks

    先說說interface和abstract method語法中需要注意的地方。

    Interface:

    1. An interface can contain fields, but these are implicitly static and final.

    2. You can choose to explicitly declare the methods in an interface as public, but they are public even if you don’t say it.

    3. Interface cannot define static method

     

    Abstract:

    1. 一個類中如果所有的方法都有實現(xiàn),我們?nèi)匀豢梢远x這個類為abstract class

    2. abstract和static不能放在一起定義方法。

     

    Interface和Abstract class的實踐

    1. interface適合定義mixins(不知道m(xù)ixin怎么翻譯,它指窄接口,只定義specific contract).

    java不能多重繼承。如果想達到多重繼承的效果,需要借助“多重實現(xiàn)”interface. interface的一個典型用法是定義小接口。比如Comparable。這樣它的實現(xiàn)成本比較小,一個class比較容易mixin多個interface。

    2. 如果interface不是mixin, 而是大一點的接口。

    effective java, 2nd edition有精彩的闡述,對于大接口,我們往往使用skeletal implementation class. 舉個例子:

       1: // Concrete implementation built atop skeletal implementation
       2: static List<Integer> intArrayAsList(final int[] a) {
       3: if (a == null)
       4: throw new NullPointerException();
       5: return new AbstractList<Integer>() {
       6: public Integer get(int i) {
       7: return a[i];  // Autoboxing (Item 5)
       8: }
       9: @Override public Integer set(int i, Integer val) {
      10: int oldVal = a[i];
      11: a[i] = val;     // Auto-unboxing
      12: return oldVal;  // Autoboxing
      13: }
      14: public int size() {
      15: return a.length;
      16: }
      17: };
      18: }

    new AbstractList<Integer>就是在應用Skeletal implementation. 有兩個好處:

    a) 它使實現(xiàn)接口更方便了

    b) If, in a subsequent release, you want to add a new method to an abstract class, you can always add a concrete method containing a reasonable default implementation. All existing implementations of the abstract class will then provide the new method. This does not work for interfaces.

    跟interface相關(guān)的還有一個話題是wrapper class,也很精彩,它是把繼承轉(zhuǎn)成合成的方式,應用了decorater模式的思想. 在書里的第16章介紹。

       1: // Wrapper class - uses composition in place of inheritance
       2: public class InstrumentedSet<E> extends ForwardingSet<E> {
       3:     private int addCount = 0;
       4:     public InstrumentedSet(Set<E> s) {
       5:         super(s);
       6:     }
       7:     @Override public boolean add(E e) {
       8:         addCount++;
       9:         return super.add(e);
      10:     }
      11:     @Override public boolean addAll(Collection<? extends E> c) {
      12:         addCount += c.size();
      13:         return super.addAll(c);
      14:     }
      15:     public int getAddCount() {
      16:         return addCount;
      17:     }
      18: }
      19: // Reusable forwarding class
      20: public class ForwardingSet<E> implements Set<E> {
      21:     private final Set<E> s;
      22:     public ForwardingSet(Set<E> s) { this.s = s; }
      23:     public void clear()               { s.clear();            }
      24:     public boolean contains(Object o) { return s.contains(o); }
      25:     public boolean isEmpty()          { return s.isEmpty();   }
      26:     public int size()                 { return s.size();      }
      27:     public Iterator<E> iterator()     { return s.iterator();  }
      28:     public boolean add(E e)           { return s.add(e);      }
      29:     public boolean remove(Object o)   { return s.remove(o);   }
      30:     public boolean containsAll(Collection<?> c)
      31:                                    { return s.containsAll(c); }
      32:     public boolean addAll(Collection<? extends E> c)
      33:                                    { return s.addAll(c);      }
      34:     public boolean removeAll(Collection<?> c)
      35:                                    { return s.removeAll(c);   }
      36:     public boolean retainAll(Collection<?> c)
      37:                                    { return s.retainAll(c);   }
      38:     public Object[] toArray()          { return s.toArray();  }
      39:     public <T> T[] toArray(T[] a)      { return s.toArray(a); }
      40:     @Override public boolean equals(Object o)
      41:                                        { return s.equals(o);  }
      42:     @Override public int hashCode()    { return s.hashCode(); }
      43:     @Override public String toString() { return s.toString(); }
      44: }

    使用它的客戶端程序:

       1: Set<Date> s = new InstrumentedSet<Date>(new TreeSet<Date>(cmp));
       2: Set<E> s2 = new InstrumentedSet<E>(new HashSet<E>(capacity));

     

    3. 人人都說 面向接口編程,很多時候矯枉過正了, 搞得接口漫天飛。interface常常是重構(gòu)出來的,而不總是設計出來的。程序分層中,越是靠近底層的程序,越傾向于需要接口,越靠近頂層的程序,對接口的需求傾向于越小。如果你明知道以后不太可能提供另一套實現(xiàn),提前寫個接口擺那里也沒啥意義,盡管定義接口的成本很低。如果你擔心一旦有一天確實提供了另一套實現(xiàn),重構(gòu)code也不會很麻煩。只要遵守了單一職責原則和迪米特法則。迪米特法則的一種表述方式是:talk only to your immediate friends。

    posted on 2011-02-20 22:06 人在江湖 閱讀(4945) 評論(1)  編輯  收藏 所屬分類: java

    Feedback

    # re: 總結(jié)java的interface和abstract class 2014-01-27 18:04 Hi, how are u.
    mixin interface并不是你所說的“窄接口”,也并不是只定義specific contract。
    Comparable接口里包含一個方法。

    這種混合接口的含義是這樣的:a mixin is a type that a class can implement in addition to its “primary type” to declare that it provides some optional behavior.

    這種接口只是表明了某一類的類具有某一種特殊的行為,而這種行為放在繼承樹上讓所有的子類都擁有這種行為是不合理的。  回復  更多評論
      

    主站蜘蛛池模板: 亚洲国产综合精品中文字幕 | 亚洲日韩国产欧美一区二区三区| 亚洲精品亚洲人成在线观看麻豆| 亚洲精品国产第一综合99久久| 免费国产精品视频| 国产成人麻豆亚洲综合无码精品| 亚洲国语精品自产拍在线观看| 亚洲欧美熟妇综合久久久久| 一本无码人妻在中文字幕免费 | 国产精品国产亚洲精品看不卡| 亚洲制服在线观看| 国产激情久久久久影院老熟女免费 | 东方aⅴ免费观看久久av | 国产成人精品免费直播| 国产亚洲精品观看91在线| 亚洲色中文字幕在线播放| 野花香高清视频在线观看免费 | 国产免费丝袜调教视频| 亚洲高清无码在线观看| 亚洲精品二三区伊人久久| 三年片在线观看免费西瓜视频| 亚洲春色在线视频| 精品久久8x国产免费观看| 亚洲国产精品无码专区在线观看| 久久国产乱子伦精品免费看| 亚洲日本乱码在线观看| 一级一看免费完整版毛片| 日本牲交大片免费观看| 精品丝袜国产自在线拍亚洲| 国产无遮挡又黄又爽免费视频| 视频免费1区二区三区| 国产18禁黄网站免费观看| 亚洲视频在线观看2018| 国产做国产爱免费视频| 免费观看亚洲人成网站| 中国在线观看免费的www| 亚洲色婷婷综合开心网| 日韩毛片一区视频免费| 国产hs免费高清在线观看| 两个人看的www免费视频| 亚洲最大的黄色网|