針對龐大方法體,可使用 Extract Method 將部分代碼提煉為小方法並在原處插入調用。若存在重複代碼段,提煉為獨立方法更利於復用。
操作:選中目標代碼塊 → Ctrl+Shift+R → Extract Method。JBuilder 會分析選中塊引用的上下文變量,自動生成對應參數並傳遞。
示例:Horse.java 中的 printQuotation() 方法:
public void printQuotation(int amount) {
printBanner();
System.out.println("單價:" + price);
System.out.println("購買只數:" + amount);
System.out.println("總價:" + (price * amount));
}
選中第 4-6 行 → 提煉為 printDetail():

圖 12 提煉方法對話框
輸入方法名 printDetail 確定後,生成代碼:
public void printQuotation(int amount) {
printBanner();
printDetail(amount); // 原處插入調用
}
// 提煉出的新方法
private void printDetail(int amount) {
System.out.println("單價:" + price);
System.out.println("購買只數:" + amount);
System.out.println("總價:" + (price * amount));
}
新方法參數 amount 用於傳遞上下文變量,調用處自動傳入。
內聯方法是提煉的反操作:以方法體替換調用。若方法為 private 且無其他調用處,內聯後將刪除該方法。
示例:游標置於 printDetail() 調用處 → Ctrl+Shift+R → Inline Method,代碼還原為提煉前狀態。適用於系統中存在過多委托層導致關係難以理解時,移除無用委托方法。
方法中多次出現相同表達式時,可提煉為局部變量。示例:
public void printAccountPrice(int amount) {
if (amount <= 100) {
System.out.println("總價:" + (amount * price));
} else if (amount <= 500) {
System.out.println("總價(打9折):" + (amount * price) * 0.9);
} else {
System.out.println("總價(打9折):" + (amount * price) * 0.9);
}
}
amount * price 出現 3 次。游標選中該表達式 → Ctrl+Shift+R → Introduce Variable:

圖 13 引入變量對話框
totalPrice重構後:
public void printAccountPrice(int amount) {
double totalPrice = (amount * price);
if (amount <= 100) {
System.out.println("總價:" + totalPrice);
} else if (amount <= 500) {
System.out.println("總價(打9折):" + totalPrice * 0.9);
} else {
System.out.println("總價(打9折):" + totalPrice * 0.9);
}
}
複雜表達式(如 n*Math.PI*r*r*h/3*price)應按語義拆分為多個變量(體積、總價)以提升可讀性。
內聯變量是提煉變量的逆操作。兩種方式:
演示第二種:游標置於第 5 行 totalPrice → Ctrl+Shift+R → Inline Variable:

圖 14 內聯變量對話框
確定後代碼還原為提煉前狀態。