在 Java 中 import 時該使用萬用字元還是明確指定

Java Import

因為使用 IDE 的關係,import 的部份都是由 IDE 自動處理。在 Eclipse 中,當你輸入某個類別時,若該類別尚未 import 到該檔案,就會出現紅色波浪底線,這時候可以有 3 種方式讓 Eclipse 幫你自動 import:
  • 把滑鼠游標移至該紅色波浪底線的類別上,會出現浮動視窗,選擇 import
  • 使用鍵盤,將游標移至該紅色波浪底線的類別上,按下 F2 然後 import
  • 使用快速鍵 ctrl + shift + O 會自動將所有未 import 的類別全部 import
一直以來都是這樣處理,直到讀到 《Clean Code》,作者 Martin 是建議使用萬用字元 (*) 來取代 import 同一 package 下超過 2 個(含)以上的類別,理由是為了容易閱讀。

以前一直都只在意編譯效能,因為使用 (*) 會影響編譯時的效能,所以都是採用很明確的 import 方式,倒是忽略的閱讀性。既然大師這麼建議,我就查了一下 2 種 import 方式在效能上的差異。

在 Stackoverflow 上的討論文章[1]的解答是,不影響 runtime 的效能,因為無論如何 import ,最後都會產生相同的 bytecode。另一篇[2]直接談到效能,則明白說了,import 是編譯時期的指示符號,所以只會影響編譯時期的效能。

還有一篇[3]則說到,使用萬用字元 (*) 是會影響到一點點的編譯時期效能,讓編譯時間略慢,但其實是可以忽略的。在閱讀性方面則和《Clean Code》作者說的一樣,使用萬用字元 (*) 會比較好。但會產生一個問題,就是對於不同套件但同名類別,而引發名稱衝突的問題。

因為 Eclipse 可以折疊程式碼,所以我覺得其實明確指定雖然會讓 import 比較長,但其實折疊了以後,對於閱讀的影響也不是太明顯。在還沒讀《Clean Code》之前,是從來都沒去想過閱讀性的問題,也許該來調整一下。

總結:
  • 不管如何 import 都不會影響 runtime 的效能,只略微影響編譯時期的效能
  • 使用萬用字元 (*) 閱讀性較佳
  • 使用萬用字元 (*) 可能引發不同套件但同名類別的名稱衝突的問題
  • 萬用字元 (*) 只適合在 import 同一 package 超過 2 個(含)以上的類別時使用
參考資料:
[1] Performance difference between a wild card import and the required class import
[2] Question of the month: cost of import statements June 25th, 2003
[3] Wild Card Vs Specific Imports
本文網址:http://blog.tonycube.com/2014/09/java-import.html
Tony Blog 撰寫,轉載時請註明出處及文章連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。