1. 程式人生 > >編寫高質量程式碼:改善Java程式的151個建議(第3章:類、物件及方法___建議31~40)

編寫高質量程式碼:改善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();

0f2068267775be66c89ba467366ccf039f3.jpg

當例項化時,執行順序:靜態程式碼塊>>構造程式碼塊>>建構函式>>普通方法。

當類名呼叫靜態方法,不例項化時:

f9e5eb570a5dfd6538a85698242cfc01bc0.jpg

只執行靜態程式碼塊和對應的靜態函式,建構函式不執行!

3、構造程式碼塊應用場景:

① 初始化例項變數

如果每個建構函式都要初始化變數,可以通過構造程式碼塊來實現。(不明白)

② 初始化例項變數

一個物件必須在適當的場景下才能存在,如果沒有適當的場景,就需要在建立該物件的時候建立場景。例如HTTP request必須首先建立HTTP session,此時就可以通過構造程式碼塊來檢查HTTP session是否已經存在,不存在則建立。

注:建構函式要實現複雜邏輯的時候,可以通過編寫多個構造程式碼塊來實現,每個程式碼塊完成不同的業務邏輯(建構函式儘量簡單的原則),按照業務順序依次存放,這樣在建立例項物件時JVM會按照順序依次執行,實現複雜物件的模組化建立。

 

江疏影讀書系列之編寫高質量程式碼:改善Java程式的15