Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android應用開發提高系列(3)——《Effective Java 中文版》讀書筆記

Android應用開發提高系列(3)——《Effective Java 中文版》讀書筆記

編輯:Android開發實例

書籍

  《Effective Java 中文版》  03版  潘愛民譯  

  本書介紹了57條極具實用價值的經驗規則。這些經驗規則涵蓋了大多數開發人員每天所面臨的問題的解決方案,通過對Java平台設計專家所使用的技術的全面描述,揭示了應坐什麼和不應做什麼,才能產生清晰、健壯和高效的代碼。
 

 

正文
 

  注意:條目和用語可能與書籍有所出入,但盡量保持原樣加一些自己的理解。

  1.  構造函數一定不能調用可被覆寫的方法,無論是直接還是間接進行。

 

  2.  接口應該只是被用來定義類型的,它們不應被用來導出常量。(備注:不要再接口中定義常量)P/89

 

  3.  一個安全而保守的策略是,永遠不要導出兩個具有相同參數數目的重載方法。

 

  4.  返回零長度的數組而不是null。

 

  5.   嵌套類
 

    嵌套類(nested class)是指被定義在另一個類的內部的類,其存在的目的應該只是為它的外圍類提供服務。嵌套類分為四種:
 

      5.1  靜態成員類(static member class)

        最簡單的嵌套類,最好把它看做一個普通的類。它可以訪問外圍類的所有成員,包括那些聲明為私有的成員。與其他類靜態成員一樣,也遵守同樣的可訪問性規則。

        其通常用法是作為公有的輔助類,僅當與它外部類一起使用時才有意義。

        私有靜態成員類的一種通常用法是用來代表外圍類對象的組件。例如,Map實例的內部通常有一個Entry對象對應與Map中每一對鍵值對,雖然每一個Entry都與一個Map關聯,但Entry上的方法(getKey、getValue、setValue)並不需要訪問該Map。因此使用非靜態成員來表示Entry是浪費的,私有靜態成員類是最佳的選擇。

 

      5.2  非靜態成員類(nonstatic member class)

        非靜態成員類的每一個實例都包含一個額外指向外部類對象的引用。維護這份引用要消耗時間和空間。

        其通常用法是定義一個Adapter,它允許外圍類的一個實例被看做另一個不相關的類的實例。例如,Map接口的實現往往使用非靜態成員類來實現它們的集合視圖。

 

      5.3  匿名類(anonymous class)

        沒有名字,它不是外圍類的一個成員,在使用的同時被聲明和實例化。可以出現在代碼中任何允許表達式出現的地方。通常只實現了其接口中或超類中的方法,不會聲明任何新的方法,它們應該非常簡短。
 

        用法1  是創建一個函數對象(function object),比如Comparator實例。例如:

        Arrays.sort(args, new Comparator<String>() {
            @Override
            public int compare(String obj1, String obj2) {
                return obj1.length() - obj2.length();
            }
        });

        用法2  創建一個過程對象(process object),比如Thread、Runable或者TimeTask實例。

        用法3  在一個靜態工廠方法的內部,如:

    static List intArrayList(final int[] a){
        return new AbstractList<Integer>() {

            @Override
            public Integer get(int location) {
                return a[location];
            }

            @Override
            public int size() {
                return a.length;
            }};
    }

        用法4  在復雜的類型安全枚舉類型中,用於公有的靜態final域的初始化器中,例如:

    public abstract class Operation {
        private final String name;

        Operation(String name) {
            this.name = name;
        }

        public String toString() {
            return this.name;
        }

        abstract double eval(double x, double y);

        public static final Operation PLUS = new Operation("+") {
            @Override
            double eval(double x, double y) {
                return x + y;
            }
        };
    }

 

       5.4  局部類(local class)

        使用最少,在任何“可以聲明局部變量”的地方,都可以聲明局部類,也遵守同樣的作用域規則。與匿名類一樣,它們必須非常簡短。

    簡而言之,如果一個嵌套類需要在單個方法之外仍然是可見的,或者它太長了,不適合放在一個方法內部,那麼應該使用成員類。如果成員類的每個實例都需要一個指向其外圍實例的引用,則把成員類做成非靜態的;否則就做成靜態的。假設一個嵌套類屬於一個方法的內部,如果你只需要在一個地方創建它的實例,並且已經有了一個預先存放的類型可以說明這個類的特征,則把它做成匿名類;否則就做成局部類。

 

  6.  了解和使用庫

    應該熟悉java.lang、java.util以及java.io中的內容。

    6.1  Random.nextInt(int)   產生隨機整數。
 

    6.2  Collections.sort(v)  字符串組成的Vector排序

    6.3  Collections.sort(v, String.CASE_INSENSITIVE_ORDER)  字符串組成的Vector排序,忽略大小寫
 

    6.4  System.out.println(Arrays.asList(a))  循環打印一個數組中所有的元素

    6.5  獲取兩個Hashtable包含相同映射鍵值的所有鍵:

        Map tmp = new HashMap(h1);
        tmp.entrySet().retainAll(h2.entrySet());
        Set result = tmp.keySet();

    6.6  Arrays.toString(a)  打印數組每一個元素

    6.7  Arrays.equals(a1, a2)  比較兩個數組長度、每一個元素是否相等。

 

 

  7.  使用異常

    7.1  被檢查的異常(checked exception)

      通過拋出一個被檢查的異常,強迫調用者在一個catch子句中處理異常,或者將它傳播到外面。

    7.2  運行時異常(run-time exception)

      大多數的運行時異常都是指API的客戶沒有遵守API規范建立的約定。例如數組越界。

    總而言之,對於可恢復的條件,使用被檢查的異常;對於程序錯誤,使用運行時異常。

 

  8.  盡量使用標准的異常

    8.1  IllegalArgumentException  調用者傳遞的參數不合適

    8.2  NullPointException  空指針異常

    8.3  IndexOutOfBoundsException  下標越界

    8.4  ConcurrentModificationException  在禁止並發修改的情況下,對象檢測到並發修改

    8.5  UnsupportedOperationException  對象不支持所請求的方法

 

 

結束

  由於先讀的 《Practical Java》,與本書內容有部分相似,所以看得比較快,仍然值得一讀,也終於弄懂關於嵌套類這塊的內容。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved