快捷鍵:
- MacOS : ⌘⌥B
- WindowsOS : Ctrl + Alt + P
還記得基礎篇提到的跳到宣告(Go to declaration)快捷鍵 ⌘B 嗎,這次小編教大家更進階的 跳到實作 ⌘⌥B (Go to implementation),什麼時候會用到呢?這個快捷鍵用在介面中找尋有哪些實作這個介面的類別以及其類別內的方法,舉下圖為例,下圖是UML中的 class diagram,用來表達目前類別間的關係。這個圖表表達目前系統中有一個 Vehicle 介面,而 Car 跟 Bus 類別實作這個 Vehicle介面所以必須完成實作Vehicle的介面方法。
下面這是Vehicle介面的程式碼,共有五個介面方法。我們想要知道宣告方法分別在不同的 Class有什麼樣子的實作,此時我們對感興趣的介面方法使用 ⌘⌥B 就可以把有實作的類別方法叫出來。
下圖展示了對 Vehiclde介面中的方法 getHorsePower() 按下⌘⌥B後IDE就會跳出 Bus 跟 Car類別,IDE會詢問開發人員想看哪一個類別的實作。
我們點選 Bus 後就會直接跳到 Bus的 getHorsePower()方法讓開發人員確認實作的樣子。
想要回到 Super Class 也很簡單,除了使用以前教到的往上一層導航外,還可以使用 ⌘U 導航回到 Super Class。
展示型別階層 (Type Hierarchy)、方法階層(Method Hierarchy)、呼叫階層(Call Hierarchy)
型別階層 (Type Hierarchy)
快捷鍵:
- MacOS : ⌃H
- WindowsOS : Ctrl+ H
型別階層(Type Hierarcy)這個名詞乍看之下讓人有點摸不著頭緒,簡單來說其用途是為展示父類別與子類別間的關係。較大型且有良好架構的系統,通常會利用繼承的方式來做到彈性的擴展,開發人員可以透過這個快捷鍵了解各個類別的繼承關係。以下面這個例子來說,若想知道Vehicle這個介面(Interface)底下有哪一些類別繼承,可以在Vehicle 介面上按下 ⌃H ,此時就會顯示出 Bus跟Car這兩個子類別。
到Car類別可以看到 Car implements Vehicle,因此Car類別確實實作了Vehicle,是Vehicle的子類別。另外對Car類別也進行 Type Hierarcy的查詢 (⌃H) 也可以看到Car類別底下有一個 AudiCar的子類別。
方法階層(Method Hierarchy)
快捷鍵:
- MacOS : ⌘⇧H
- WindowsOS : Ctrl + Shift + H
型別階層的快捷鍵是用來查看類別間的狀態,而查看方法間的快捷鍵則要使用 ⌘⇧H (方法階層,Method Hierarcy),顧名思義就是用來查看方法間的繼承狀態,以Car類別中的 getTires() 這個方法為例,對getTires()方法按下 ⌘⇧H 會顯示這個 getTires() 在父介面 Vehicle()中也有宣告,而且在子類別AudiCar()中也有。
不過眼尖的讀者會觀察到 Method Hierarchy 顯示的視窗中,有 綠色+號跟紅色 -號,如同下圖紅圈1的地方。
綠色 + 號的意思是方法確實定義在這個class內,Car類別確實有 getTires()這個方法這個無庸置疑,那麼紅色減號是什麼意思呢?紅色減號是指此方法(getTires())並沒有定義在這個類別中,但是有定義在其父類別。簡單來說就是AudiCar()這個類別沒有自行定義 getTires() 這個方法,而是透過繼承的方式取得 getTires()的方法,到AudiCar()這個類別就會一目了然。
下圖是AudiCar類別的全部程式碼,很明顯這個類別自己定義的方法只有一個 getPassengersLimit(),並沒有剛才提到的 getTires()方法。因此我們知道,AudiCar 是透過繼承 Car這個類別來取得 Car的所有方法,而且只有 override getPassengersLimit()這個方法。
這裡有一個問題考考大家,對Car類別使用 Type Hierarcy 的時候為什麼沒有顯示 Vehicle 介面呢?Car明明是實作 Vehicle 介面理論上應該也屬於 Vehicle的子類別。
原因在於 Type Hierarcy 啟動時是顯示 Class Hierarchy,只有一般Class跟Abstract Class 才屬於 Class,Interface 是不屬於Class的唷,這點要特別注意。
Type Hierarcy 的上方列依序是 1.Class Hierarcy 2.Supertypes Hierarcy 3.Subtypes Hierarcy
當我們切到 Supertypes Hierarcy 就可以看到 Vehicle 這個 Interface了
呼叫階層(Call Hierarchy)
快捷鍵:
- MacOS : ⌃⌥H
- WindowsOS : Ctrl + Alt + H
用來顯示 Callers(supertypes) 或是 Callee (subtypes) 的方法,有助於開發人員追蹤這個方法是從哪個方法開始呼叫,途中經過哪些方法。
下面的例子有四個類別(紅圈1),ACallB 類別裡面會有方法是呼叫 BCallC 類別的方法(紅圈2),而BCallC類別內的方法會呼叫CCallD類別的方法,依此類推。
而我們透過 Call Hierarcy 可以看到callE這個方法是一路從 ACallB.callB() -> BCallC.callC() -> CallD.callD() 呼叫上來的
尋找編譯錯誤 (highlighted error)
快捷鍵:
- MacOS:
- F2 往下一個 error, warning, suggestion 間互相移動
- ⇧F2 往上一個 error, warning, suggestion 間互相移動
- WindowsOS:
- F2 往下一個 error, warning, suggestion 間互相移動
- ⇧F2 往上一個 error, warning, suggestion 間互相移動
考大家一個問題,IntelliJ 若判斷程式碼有編譯上的錯誤,會用什麼顏色的下引線提示?再者若判斷程式碼有優化的可能,會用什麼顏色的下引線呢?答案在上一篇 “自動修正錯誤與優化” 中有介紹喔!忘記的夥伴要記得回去複習。
IntelliJ若判斷編譯有錯時,除了該處會有紅色的下引線外,還會在程式碼編輯區右邊會顯示一槓紅色的線,這也是代表有編譯錯誤。若想要快速的移動到該處,除了使用滑鼠點擊這個紅色一槓外,還可以使用 F2,按下F2就會跳到下一個 highlighted error處。
按下F2後直接跳到error處
高光參數、方法、類別 (highlight symbol)
快捷鍵:
- MacOS : ⌘⇧F7
- WindowsOS : Ctrl + Shift + F7
我們在追蹤程式碼時,有些程式碼檔案非常的冗長常常在開頭看到這個變數,往下追蹤幾段程式碼後就忘記我們在追蹤什麼變數了,利用 highlight symbol可以很方便的讓想追蹤的變數一直都被 highlight起來,下面的例子是對 employeeID這個變數進行highlight,就算滑鼠移到另一個參數 employeeFirstName上,對 employeeID的highlight也不會消失,非常適合追蹤。
這個快捷鍵不僅對變數有用喔,連方法跟類別都可以鎖定,很常迷路在程式碼內的夥伴一定要把這個快捷鍵學起來。
最佳化引用類別 (Optimize Imports)
快捷鍵:
- MacOS : ⌃⌥O
- WindowsOS : Ctrl + Alt + O
當埋頭苦寫程式時,有時候引用到不需要的第三方library。以下面的例子為例,開發時在程式中import了 URLDecoder 這個類別,但後來使用別的第三方提供的 decoder後,因為IDE判斷 URLDecoder 沒有在這個類別被使用到,就會像下圖這樣以灰色來呈現。
此時可以使用快捷鍵 ⌃⌥O, IDE會自動把沒有用到的函式庫移除,也會把需要的函式庫 import近來,按下 ⌃⌥O 後 URLDecoder就被移除了。
結論
本篇的快捷鍵介紹由於增加了追蹤(trace)類別繼承(extends)、覆寫(override),因此會比前面兩篇還要再難一些,不過大家一定要沉住氣慢慢學習,學到後面會突然豁然開朗喔!如果這篇文章對各位有幫助,可以把它分享出去給正在學習IDE寫程式的夥伴喔!