整合重複的初始化邏輯

2021-10-04 22:36:52 字數 1467 閱讀 1381

我們在開發中會在乙個類中定義不同版本的建構函式,這些建構函式往往存在相同的初始化邏輯。遇到這種情況一部分開發人員會在每個建構函式中編寫相同的**,這種編寫**的方式是比較低階的,正確的做法應該是將相同的初始化邏輯提取到乙個公用的建構函式中,並讓其他建構函式直接或間接的呼叫。這樣既可以減少重複的**,又可以使得編譯器根據初始化命令生成更高效的目標**。下面我們就根據上面所說的內容來編寫一下**。

public

class

demo

public

demo

(int

initcount)

:this

(initcount,

string

.empty)

public

demo

(int

initcount,

string

name)

}

我們使用上面的方式來編寫建構函式的話,我們需要考慮不同引數的組合形式,也就是說我們需要提供無參的建構函式、只包含 initcount 引數的建構函式、只包含 name 引數的建構函式,以及同時包含這兩個引數的建構函式。那麼,如果類中新增了乙個新的成員,這時我們就需要編寫更多的建構函式來適應更多的引數組合。遇到這種情況我們就應該在開發中編寫帶有預設值的建構函式,這樣呼叫方使用我們編寫的建構函式的時候會很靈活。對於開發這個類的開發人員來說減少了**的編寫量。下面我們就來改寫一下上面的**。

pblic class

demo

public

demo

(int

initcount=0,

string

name="")

}

tip: 這裡需要注意的是,如果我們想讓呼叫方通過 new demo() 的寫法呼叫函式的話就必須顯示定義無參建構函式。

帶有預設值引數的建構函式雖好,但是他也有缺點。他會令客戶端**和該類高耦合,尤其是會令型形參的名稱和預設值成為公共介面的一部分,如果修改了預設值那麼客戶端就必須重新編譯一遍才能使那些使用舊預設值的**轉而使用新的預設值,那麼這時使用過載建構函式的方法是最好的。對於上面的**來說使用引數預設值機制來編寫建構函式是最好的方式,但是有些 api 會使用反射建立物件,這時就需要依賴於無參建構函式,但是這又出現了文章一開始所提到的問題–**重複。要避免這個問題我們可以使用鏈式呼叫,也就是說用乙個建構函式去呼叫本類的另乙個建構函式,看到這裡一定會有讀者會說我們可以將公用**提取到乙個方法中,構造函式呼叫這個方法,何必用鏈式呼叫呢?這種方式雖然和鏈式呼叫的效果類似但是效率很低,這是因為編譯器會在每個建構函式裡都執行同乙個操作,也就是說要新增語句來設定各種變數的初始值並呼叫基類的建構函式,進而在每個建構函式裡都執行一遍這個**。而是用鏈式呼叫的方法編譯器不會在每個建構函式裡都去呼叫基類的建構函式,也不會把初始化成員變數所需要的邏輯在每個建構函式中重複一遍,它只會在最後那個建構函式裡呼叫基類的建構函式。

初始化 指定初始化

id alloc 物件的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部例項變數,並將其指定為存放記憶體物件的實力變數的位置。alloc方法同時將這塊記憶體全部設定為0。結果是 bool變數初始化為no,所有的int型別變數為0,float變數為0.0,所有的指標為nil.obje...

初始化 1 預設初始化 列表初始化

初始化的基本概念 事實 初始化和賦值是兩個完全不同的操作。初始化,是建立變數時賦予其乙個初始值。賦值,是把物件的當前值擦除,用乙個新值代替。列表初始化 p39 作為c 11新標準的一部分,用花括號 來初始化變數得到了全面應用。出於某些原因,這種初始化的方式叫做列表初始化。現在,無論是初始化物件還是某...

初始化 MyBatis初始化之載入初始化

在mybatis初始化過程中,大致會有以下幾個步驟 1.建立configuration全域性配置物件,會往typealiasregistry別名註冊中心新增mybatis需要用到的相關類,並設定預設的語言驅動類為xmllanguagedriver 3.構建defaultsqlsessionfacto...