編輯:關於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 拿到美工效果圖,咱們程序員就得畫得一模一樣。 為了不被老板噴,只能多練啊。 聽說你覺得前面幾篇都so eas
Hive 1.2.1&Spark&Sqoop安裝指南Hive 1.2.1&Spark&Sqoop安裝指南.pdf目錄目錄11.前言12.約定23.服務端口
Form and Control KeyEvent一、Form的KeyEvent KeyCode: private void Form1_KeyDown(object
Android黑科技,讀取用戶短信+修改系統短信數據庫, 安卓系統比起ios系統最大的缺點,相信大家都知道,就是系統安全問題。這篇博客就秀一波&ldquo