編輯:關於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》,與本書內容有部分相似,所以看得比較快,仍然值得一讀,也終於弄懂關於嵌套類這塊的內容。
手把手帶你畫一個 時尚儀表盤 Android 自定義View
手把手帶你畫一個 時尚儀表盤 Android 自定義View 拿到美工效果圖,咱們程序員就得畫得一模一樣。 為了不被老板噴,只能多練啊。 聽說你覺得前面幾篇都so eas
Hive 1.2.1&Spark&Sqoop安裝指南
Hive 1.2.1&Spark&Sqoop安裝指南Hive 1.2.1&Spark&Sqoop安裝指南.pdf目錄目錄11.前言12.約定23.服務端口
Form and Control KeyEvent
Form and Control KeyEvent一、Form的KeyEvent KeyCode: private void Form1_KeyDown(object
Android黑科技,讀取用戶短信+修改系統短信數據庫,
Android黑科技,讀取用戶短信+修改系統短信數據庫, 安卓系統比起ios系統最大的缺點,相信大家都知道,就是系統安全問題。這篇博客就秀一波&ldquo