編寫高質量程式碼:改善Java程式的151個建議(第3章:類、物件及方法___建議31~40)
書讀的多而不思考,你會覺得自己知道的很多。
書讀的多而思考,你會覺得自己不懂的越來越多。 -----江疏影
在面向物件程式設計(Object-Oriented Programming, OOP)的世界裡,類和物件是真實世界的描述工具,方法是行為和動作的展示形式,封裝、繼承、多型則是其多姿多彩的主要實現方式,本章主要講述關於Java物件,方法的種種規則,限制和建議。
建議31:在介面中不要存在實現程式碼
建議32:靜態變數一定要先聲明後賦值
建議33:不要重寫靜態方法
例項物件訪問靜態方法或靜態屬性不是好習慣,直接類名呼叫就行了。
建議34:建構函式儘量簡化
建議35:避免在建構函式中初始化其他類
建議36:使用構造函程式碼塊精簡程式
1、程式碼塊基本概念:
什麼叫做程式碼塊(Code Block)?用大括號把多行程式碼封裝在一起,形成一個獨立的資料體,實現特定演算法的程式碼集合即為程式碼塊,一般來說程式碼快不能單獨執行的,必須要有執行主體。在Java中一共有四種類型的程式碼塊:
普通程式碼塊:就是在方法後面使用"{}"括起來的程式碼片段,它不能單獨執行,必須通過方法名呼叫執行;
靜態程式碼塊:在類中使用static修飾,並用"{}"括起來的程式碼片段,用於靜態變數初始化或物件建立前的環境初始化。
同步程式碼塊:使用synchronized關鍵字修飾,並使用"{}"括起來的程式碼片段,它表示同一時間只能有一個執行緒進入到該方法塊中,是一種多執行緒保護機制。
構造程式碼塊:在類中沒有任何字首和字尾,並使用"{}"括起來的程式碼片段;
2、程式碼例項展示:
package OSChina.Client; public class Base { static { System.out.println("我是父類靜態程式碼塊1"); } { System.out.println("我是父類構造程式碼塊2"); } Base() { System.out.println("我是父類無參構造3"); } public static void doSomething(){ System.out.println("我是父類靜態函式"); } }
package OSChina.Client;
public class Sub extends Base{
static {
System.out.println("我是子類靜態程式碼塊1");
}
{
System.out.println("我是子類構造程式碼塊2");
}
Sub(){
System.out.println("我是子類無參構造3");
}
}
當例項化時:
Base base = new Sub();
當例項化時,執行順序:靜態程式碼塊>>構造程式碼塊>>建構函式>>普通方法。
當類名呼叫靜態方法,不例項化時:
只執行靜態程式碼塊和對應的靜態函式,建構函式不執行!
3、構造程式碼塊應用場景:
① 初始化例項變數
如果每個建構函式都要初始化變數,可以通過構造程式碼塊來實現。(不明白)
② 初始化例項變數
一個物件必須在適當的場景下才能存在,如果沒有適當的場景,就需要在建立該物件的時候建立場景。例如HTTP request必須首先建立HTTP session,此時就可以通過構造程式碼塊來檢查HTTP session是否已經存在,不存在則建立。
注:建構函式要實現複雜邏輯的時候,可以通過編寫多個構造程式碼塊來實現,每個程式碼塊完成不同的業務邏輯(建構函式儘量簡單的原則),按照業務順序依次存放,這樣在建立例項物件時JVM會按照順序依次執行,實現複雜物件的模組化建立。