1. 程式人生 > >節省兩倍開發時間,Java靜態方法還可以這麼玩!

節省兩倍開發時間,Java靜態方法還可以這麼玩!

鏈式呼叫

首先需要提一下最近幾年在開發界大的鏈式呼叫,鏈式呼叫非常利於編寫,更利於閱讀,那麼,什麼是鏈式呼叫呢,為了掃盲,舉個例子。

節省兩倍開發時間,Java靜態方法還可以這麼玩

栗子

示例程式碼如下,如果我們想建立一個Dialog,不依賴鏈式呼叫的話,將會產生如下程式碼:

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

上述程式碼共計372個字元,當然,通過依賴強大的IDEA,我們站在巨人的肩膀上操作,通過智慧提示和自動補全,極大降低了開發成本。

那麼,現在來估算一下操作成本,通過FreeKey記錄鍵盤輸入,我們的操作路徑大概是

“NRdia .sta ; nr .set "Test��; nr .setM "Test��; nr .setnet ""�Test��; nr .setPo ""�Test��; nr .setneu� "Test��; nr .sh thi �;”

共計需要輸入126個字元,What?這樣看好像其實也沒有比全部輸入少很多。

節省兩倍開發時間,Java靜態方法還可以這麼玩

大腿

那麼,我們將這個Dialog改為鏈式呼叫模式建立,會產生如下程式碼。

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

上述程式碼共計223個字元,減少了149個字元。怎麼樣,程式碼數量是不是一下子掉下來了很多。

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

那麼,我們來統計一下鏈式呼叫的操作路徑成本,再次通過FreeKey記錄鍵盤輸入,我們的操作路徑大概是:

NRD .st .sett "Test��.setme "Test��.setneg "Test��.setpo� "Test��.setNe���� "Test��.sho thi �;

共計需要輸入94個字元,通過鏈式呼叫,我們節省了1.5倍的開發時間成本,並且隱形的節省了程式碼的閱讀成本。

方法鏈的優秀案例

一些流行的開源庫的方法鏈優秀使用案例如下:

RxJava

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

EventBus

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

靜態方法的鏈式呼叫

有些時候,我們會遇到一些需求,考慮想把靜態方法進行封裝一下,來實現優美的鏈式呼叫,Like this;

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

如果是非靜態方法的話,我們可以從容的返回this,如果是靜態方法,這麼操作,真的就是想太多。

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

或者我們這麼操作?

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

這麼操作?

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

R U OK?

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

一頓操作後,我們還是沒法實現靜態方法的鏈式呼叫,因為他必須返回一個自身的例項。

節省兩倍開發時間,Java靜態方法還可以這麼玩

鬧太套

好吧,最終屈服於IDEA,你反悔了這個靜態方法的例項。

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

建立了一個Test類的例項,然後愉快地實現了鏈式呼叫

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

可是問題來了,為了實現鏈式呼叫,我們必須為每個物件開闢記憶體空間嗎?

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

當然不!

姿勢來了,其實我們可以這樣處理:

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

定義兩個靜態方法,返回為空

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

完美實現鏈式呼叫,而且不會報空指標,這是為什麼?

原理分析

我們對上述呼叫程式碼的示例進行編譯與反編譯:

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

對應的反編譯後的位元組碼如下:

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

invokestatic呼叫靜態方法doSth和doSth2,可以直接找到索引2和索引4的方法,所以並沒有依賴Test例項。

而對於正常的物件呼叫,如果使用Null呼叫為什麼會報空指標呢?我們再來看一段示例程式碼和其反編譯的位元組碼。

宣告mainTest為空並呼叫其test方法。

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

反編譯後的位元組碼如下,invokevirtual為呼叫例項方法,動態繫結,invokevirtual #4代表會呼叫索引4的方法,即test()。

節省兩倍開發時間,Java靜態方法還可以這麼玩

 

而invokevirtual則負責找到操作棧棧頂元素所指向的物件並查詢和呼叫其相關方法,但此時棧頂為空,自然就無法找到相關方法,丟擲空指標。

而這裡就涉及到了靜態繫結和動態繫結。繫結過程,即指方法的呼叫與其類的關聯過程。

其中的靜態繫結,是在方法執行前,已經被關聯,而動態繫結則是在執行時繫結。

最後

最後,在專案程式碼中還是並不推薦這種方式,團隊開發,難免會有小夥伴們產生誤解,會認為該物件已經生成了例項了,而建立非靜態方法呼叫導致空指標。

在這裡我相信有很多想要學習java的朋友們!

那如何學習java才能快速入門並精通呢?

當真正開始學習的時候難免不知道從哪入手,導致效率低下影響繼續學習的信心。

但最重要的是不知道哪些技術需要重點掌握,學習時頻繁踩坑,最終浪費大量時間,所以有一套實用的視訊課程用來跟著學習是非常有必要的。

為了讓學習變得輕鬆、高效,今天給大家免費分享一套阿里架構師傳授的一套教學資源。幫助大家在成為架構師的道路上披荊斬棘。

這套視訊課程詳細講解了(Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化、分散式架構)等成為架構師必備的內容!

加QQ群:331789133,免費領取!