IntelliJ IDEA 2020.3提供了許多實用的功能,例如調試時的交互式提示,Git暫存支持,對Java 15記錄和密封類的擴展支持等等。它簡化了端點,框架和事件探查器的平常工做。經過基於機器學習技術的更好的代碼完成,更直觀和有用的新的「Welcome」屏幕以及更好的拼寫和語法檢查,整個UX獲得了改進。簡而言之,一切都更好!(本文主要講述「提取」這種方法,點擊查看完整版!)html
這篇博客文章涵蓋了與視頻相同的內容,幷包含一些其餘提示和技巧。點擊查看視頻>>機器學習
簡化代碼具備不少優點,包括提升可讀性,解決技術難題以及管理不斷變化的需求。咱們將在此博客中介紹三種重構類型:ide
- 提取和內聯
- 更改簽名
- 重命名
提取和內聯學習
簡化代碼的第一種方法是提取它。您能夠在IntelliJ IDEA中執行五種類型的提取重構:url
- 提取方法
- 提取常數
- 提取字段
- 提取變量
- 提取參數
提取方法.net
此方法中的switch語句與該方法的其他部分不一致。調試
public class PlanetExtractions { Planet myPlanet = new Planet("earth"); // I'm using PlanetExtractions to get the facts for my country // I'm using planetextractions to get the facts for my country private void printPlanetFacts(final String country) { System.out.println("Planet name is " + myPlanet.getName()); System.out.println("Current season is " + myPlanet.getCountryWeather()); System.out.println("Number of times the planet rotates around the sun is " + 365); System.out.println("Number of characters in planet name = " + myPlanet.getName().length()); switch (myPlanet.getCountryWeather()) { case "Spring" -> System.out.println("The weather is warm in the UK"); case "Summer" -> System.out.println("The weather is hot in the UK"); case "Autumn" -> System.out.println("The weather is cool in the UK"); default -> System.out.println("The weather is cold in the UK"); } } }
在2020.3中,此過程已簡化。您須要選擇要提取的完整代碼塊,而後能夠在macOS上使用⌘⌥M,在Windows和Linux上使用Ctrl + Alt + M來提取方法。code
咱們能夠給新方法起一個名字,例如,getWeather()而且IntelliJ IDEA將用對咱們新方法的調用替換原始邏輯:視頻
public class PlanetExtractions { public static final int NUMBER_OF_DAYS_IN_A_YEAR = 365; Planet myPlanet = new Planet("earth"); private String theWeatherIs = "The weather is"; // I'm using PlanetExtractions to get the facts for my country // I'm using planetextractions to get the facts for my country private void printPlanetFacts(final String country) { System.out.println("Planet name is " + myPlanet.getName()); System.out.println("Current season is " + myPlanet.getCountryWeather()); System.out.println("Number of times the planet rotates around the sun is " + NUMBER_OF_DAYS_IN_A_YEAR); System.out.println("Number of characters in planet name = " + myPlanet.getName().length()); getWeather(); } private void getWeather() { switch (myPlanet.getCountryWeather()) { case "Spring" -> System.out.println("The weather is warm in the UK"); case "Summer" -> System.out.println("The weather is hot in the UK"); case "Autumn" -> System.out.println("The weather is cool in the UK"); default -> System.out.println("The weather is cold in the UK"); } } }
經過再次使用相同的快捷方式,您能夠獲取「提取方法」的其餘選項。
提示:您能夠經過在macOS上使用⌘B或在Windows和Linux上使用Ctrl + B導航到方法的聲明或用法。
提取常數
咱們能夠在此代碼行中將數字365提取爲常數,由於地球始終須要大約365天才能完成繞太陽的自轉:
System.out.println("Number of times the planet rotates around the sun is " + 365);
咱們能夠選擇數字,而後在macOS上使用⌘⌥C,在Windows和Linux上使用Ctrl + Alt + C將其提取爲常數。咱們能夠給它起一個名字,例如 NUMBER_OF_DAYS_IN_A_YEAR。IntelliJ IDEA在課程開始時建立一個新的公共靜態最終常量:
public static final int NUMBER_OF_DAYS_IN_A_YEAR = 365;
IntelliJ IDEA還用新的常量替換了原始代碼行:
System.out.println("Number of times the planet rotates around the sun is " + NUMBER_OF_DAYS_IN_A_YEAR);
提取字段
在咱們提取的方法中,短語「天氣是」重複了四次,所以讓咱們將其提取到字段中:
private void getWeather() { switch (myPlanet.getCountryWeather()) { case "Spring" -> System.out.println("The weather is warm in the UK"); case "Summer" -> System.out.println("The weather is hot in the UK"); case "Autumn" -> System.out.println("The weather is cool in the UK"); default -> System.out.println("The weather is cold in the UK"); } }
您須要選擇The weather is,而後能夠在macOS上使用⌘⌥F,或在Windows和Linux上使用Ctrl + Alt + F將其提取到字段中。在「介紹字段」對話框中,咱們能夠選擇在「字段聲明」中初始化該字段,爲其指定一個名稱,例如,theWeatherIs而後選擇替換代碼中全部四個出現的字段。
當咱們按OK時,IntelliJ IDEA在班級頂部建立一個新字段:
String theWeatherIs = "The weather is";
IntelliJ IDEA還使用新字段更新了該方法:
private void getWeather() { switch (myPlanet.getCountryWeather()) { case "Spring" -> System.out.println(theWeatherIs + " warm in the UK"); case "Summer" -> System.out.println(theWeatherIs + " hot in the UK"); case "Autumn" -> System.out.println(theWeatherIs + " cool in the UK"); default -> System.out.println(theWeatherIs + " cold in the UK"); } }
提取變量
這樣的連接方法可能很難理解,所以讓咱們將其重構爲一個單獨的變量:
int planetNameLength = myPlanet.getName().length();
您能夠將光標放在連接的方法調用中,而後使用箭頭鍵選擇要提取到新變量的數量。
讓咱們提取myPlanet.getName().length()部分。咱們能夠在macOS上使用⌘⌥V,在Windows和Linux上使用Ctrl + Alt + V將其提取爲變量並命名 planetNameLength。如今咱們有了一個用於此計算的局部變量:
System.out.println("Planet name is " + myPlanet.getName().length());
IntelliJ IDEA還建立了咱們的新變量:
int planetNameLength = myPlanet.getName().length();
…並用新變量替換了咱們的代碼:
System.out.println("Number of characters in planet name = " + planetNameLength);
提取參數
讓咱們UK在此代碼中提取國家/地區,並將其做爲參數傳遞給country:
private void getWeather() { switch (myPlanet.getCountryWeather()) { case "Spring" -> System.out.println(theWeatherIs + " warm in the UK"); case "Summer" -> System.out.println(theWeatherIs + " hot in the UK"); case "Autumn" -> System.out.println(theWeatherIs + " cool in the UK"); default -> System.out.println(theWeatherIs + " cold in the UK"); } }
爲此,讓咱們選擇UK並在macOS上使用⌘⌥P,在Windows和Linux上使用Ctrl + Alt + P。咱們能夠給它起一個名字,例如country。我將要求IntelliJ IDEA替換全部四個實例,而後選擇「重構」。IntelliJ IDEA更新了咱們的方法簽名參數:
getWeather("UK");
…並替換其在文本中的全部四個出現:
private void getWeather(String country) { switch (myPlanet.getCountryWeather()) { case "Spring" -> System.out.println(theWeatherIs + " warm in the " + country); case "Summer" -> System.out.println(theWeatherIs + " hot in the " + country); case "Autumn" -> System.out.println(theWeatherIs + " cool in the " + country); default -> System.out.println(theWeatherIs + " cold in the " + country); } }
摘錄摘要
提取重構的快捷方式具備對稱性,能夠幫助您記住它們。
對於macOS,它們是⌘⌥ +您要提取的內容的首字母,對於Windows和Linux,它們是Ctrl + Alt +您要提取的內容的首字母:
- 中號編制方法
- ç onstants
- ˚F ields
- V ariables
- P arameters
是的,我知道這在技術上是五合一的,可是我真的想向您展現快捷方式的對稱性,由於它有助於我更快地學習。在繼續進行第二種主要重構類型以前,若是您改變主意,而且要內聯先前提取的內容,該怎麼辦?在下文中我將詳細講解這個問題!