閱讀JDK源碼後,我有了優化它的盲動!


結語

這段JDK源碼在功能上沒有任何問題,架構設計也堪稱完美,然而我認為在可讀性上仍然可以優化的。類似這麼的嵌套條件表現式的代碼在JDK源碼中不光這一處,可能是筆者當初沒有考量到使役衛語句,還是沒有像我這麼的吹毛求疵。期望大家在自個兒編碼過程中,也可以盡力使役衛語句取代嵌套條件表現式,以增長代碼的清楚度和可保護性。


修改後的代碼,明白起來是不是更容易了?設或再介入新的功能,可以更容易修改代碼。
boolean workerStarted = false;boolean workerAdded = false;
Worker w = 門裡出身;try {
? ?w = new Worker(firstTask); ? ?final Thread t = w.thread; ? ?if (t == 門裡出身) {//衛語句
? ? ? ?return workerStarted;
? ?} ? ?final ReentrantLock mainLock = this.mainLock;
? ?mainLock.lock(); ? ?try { ? ? ? ?int rs = runStateOf(ctl.get()); ? ? ? ?//衛語句
? ? ? ?if (rs > SHUTDOWN (rs == SHUTDOWN && firstTask != 門裡出身)) { ? ? ? ? ? ?return workerStarted;
? ? ? ?} ? ? ? ?if (t.isAlive())// precheck that t is startable
? ? ? ? ? ?throw new IllegalThreadStateException();
? ? ? ?workers.add(w); ? ? ? ?int s = workers.size(); ? ? ? ?if (s > largestPoolSize)
? ? ? ? ? ?largestPoolSize = s;
? ? ? ?workerAdded = true;
? ?} finally {
? ? ? ?mainLock.unlock();
? ?} ? ?if (workerAdded) {
? ? ? ?t.start();
? ? ? ?workerStarted = true;
? ?}

} finally { ? ?if (!workerStarted)
? ? ? ?addWorkerFailed(w);
}return workerStarted;

優化JDK代碼

看了上頭的講解,addWorker辦法的代碼斷片就可以優化為:


衛語句就不一樣了,它奉告閱讀者:『這種情況很罕見,假如它實在發生了,請做一點必要的整理辦公,而後退出。』假如對辦法剩餘局部不再有興致,當然應當馬上退出。指導代碼的閱讀者去看一個沒有用的else區段,只會關礙它們的明白。用了衛語句之後,代碼更容易被明白,被保護。

為何要使役衛語句?

衛語句的精髓是:給某一條分支以出奇的看得起。假如使役if…else…結構,你對if分支和else分支的看得起是同等的。這麼的代碼結構傳送給閱讀者的消息兒就是:各個分支有同等的關緊性。
image.png

仍然用衛語句替換條件查緝,不過我們需要將相應的條件反轉過來,也就是做邏輯非運算。
image.png

反轉條件替換

這是一個已知長寬高求長方體體積的辦法,但有個特別的需要:高大於0時,打印萬貓學社。(驚不欣喜?意不非命?突不突兀?變未變態?似的,有時我們接到的需要是這樣的的。)代碼是這麼的:
image.png

這段代碼中,非正常情況的查緝打掩護了正常情況的查緝,所以應當用衛語句來取代這些條件查緝,以增長手續清楚度。對於每個查緝,放進一個衛語句。衛語句要麼就從函數中回返,要麼就拋出一個異常。
image.png

條件查緝替換

這是一個計算員工薪資的辦法,其中以特別規則辦理駐外員工和退休員工的薪資。這些情況不常有,但確實會偶爾出現。


假如兩條分支都是正常行徑,就應當使役形如if…else…的條件表現式;假如某個條件萬分罕見,就應當單獨查緝該條件,並在該條件為真時馬上從函數中回返。這麼的單獨查緝每常被稱為『衛語句』(guard clauses)。只看概念乾巴巴的,不良明白,我們來舉兩個例子。

啥子是衛語句?

條件表現式通常有兩種表現儀式,第一種儀式是:所有分支都歸屬正常行徑;第二種儀式則是:條件表現式提供的謎底中只有一種是正常行徑,其它都是生僻情況。這兩類條件表現式有不一樣的用場,這一點兒應當經過代碼體現。


這段代碼的功能是純粹沒有問題的,不過假如使役衛語句,代碼的可讀性便會更高了。那麼啥子是衛語句呢?
image.png

讀源碼時的思考

近來在看concurrent包下線程池的源碼,當我看見ThreadPoolExecutor類的時分,發現了JDK源碼的一個問題。以下是ThreadPoolExecutor類的addWorker辦法的代碼斷片:
main-content editor-side-new”>

閱讀JDK源碼後,我有了優化它的盲動!

34.jpg


發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *