當(dāng)您執(zhí)行提取函數(shù)參數(shù)重構(gòu)時,IntelliJ IDEA 將:
⒈ 分析選定的代碼片段,以找出方法簽名是什么,如果您將這個片段提取到一個新的單獨的方法中。
⒉ 使用此方法簽名查找所有功能接口,并建議您選擇其中一個。(只建議使用 @functionalinterface 或?qū)儆谥麕斓慕涌冢纾篏uava、Apache collection 等。)
⒊ 將代碼片段與基于所選接口的匿名類封裝起來,并使用此匿名類作為參數(shù)。
⒋ 在適當(dāng)情況下,進(jìn)行相關(guān)代碼調(diào)整。
提取函數(shù)參數(shù)前:
@FunctionalInterface
public interface Person {
public void sayHello (String s);
}
public class Hello {
private void printHello () {
String s="Hello";
System.out.println(s);
}
private void printText () {
printHello();
}
}
提取函數(shù)參數(shù)后:
@FunctionalInterface
public interface Person {
public void sayHello (String s);
}
public class Hello {
private void printHello(Person person) {
String s = "Hello";
person.sayHello(s);
}
private void printText () {
printHello(new Person() {
public void sayHello(String s) {
System.out.println(s);
}
});
}
}
在上述例子中,重構(gòu)是在 System.out.println(s); 內(nèi)部執(zhí)行的 Hello.printHello()。
IntelliJ IDEA 使用適當(dāng)?shù)姆椒ê灻?(String) -> void)找到所有的功能接口,并建議您選擇其中的一個接口。(在這個例子中,接口 Person 被選中。)
結(jié)果是:
⒈ 選定的片段(System.out.println(s);)使用基于接口的匿名類包裝 Person。這個匿名類作為參數(shù)傳遞給 printHello() 內(nèi)部的調(diào)用 printText()。
⒉ 將 Person 添加為 printHello() 的參數(shù),并將最初選定的代碼片段替換為接口方法的調(diào)用(sayHello())。
⒈ 選擇感興趣的代碼片段并執(zhí)行以下操作之一:按 Ctrl+Shift+Alt+P。從主菜單或上下文菜單中選擇:重構(gòu)| 提取| 功能參數(shù)(Refactor | Extract | Functional Parameter)。從主菜單選擇:重構(gòu)| 重構(gòu)這個(Refactor | Refactor This)(Ctrl+Shift+Alt+T)并且選擇功能參數(shù)(Functional Parameter)。
⒉ 從列表中選擇所需的功能接口。
⒊ 在提取參數(shù)對話框中指定重構(gòu)選項。