2025-02-09

書籍
  《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》,與本書內容有部分相似,所以看得比較快,仍然值得一讀,也終於弄懂關於嵌套類這塊的內容。

 

摘自 農民伯伯

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *