是否有一系列 IntelliJ 自動重構可以消除多余的類 Foo?重構前: public static class Foo { private final String s; public Foo(String s) { this.s = s; } public String getS() { return s; } } private static void run() { Foo f = new Foo("blah"); f.getS().length(); f.getS().getBytes(); Foo f2 = new Foo("blahg"); f2.getS().length(); f2.getS().getBytes(); }重構后: private static void run() { String f = "blah"; f.length(); f.getBytes(); String f2 = new "blahg"; f2.length(); f2.getBytes(); }在我的具體案例中進行自動重構的原因是現實生活中 Foo 被使用了幾千次。但我也只是感興趣。使用其他自動化步驟將代理對象獲取到 Foo 的狀態非常容易,但我只是不知道如何進行最后一點。爪哇intellij-idea重構自動重構
2 回答

慕神8447489
TA貢獻1780條經驗 獲得超1個贊
不確定這在更通用的設置中如何工作,但我會:
重構
Foo
以將名稱更改getS
為非常獨特的名稱,例如XXXXXXXXX
字符串替換
.XXXXXXXXX()
為空字符串正則表達式 stringn 替換
Foo (\w+) = new Foo\("(\w+)"\);
為String $1 = "$2"
;
這將處理該run
方法中的所有內容?,F在您只需要手動刪除Foo
,雖然這不是 IntelliJ 重構,但它只需要在一個地方完成,因此可能是可以接受的。

慕仙森
TA貢獻1827條經驗 獲得超8個贊
更安全的方法是使用結構替換
在菜單中搜索結構替換
$Instance$.getS().$MethodCall$($Parameter$)
在搜索框中輸入在 $Instance$ 上添加一個過濾器,使其僅成為 Foo 的實例
用。。。來代替:
$Instance$.getS().$MethodCall$($Parameter$)
之后,您可以繼續進行結構替換并查找所有實例,然后替換它們,但運行并創建從類到“String”的
Migrate
自定義類型映射會更容易Foo
如果您想再次使用結構替換,您可以使用類似的內容進行查找和替換
Foo $name$ = new Foo($Parameter$);
String $name$ = $Parameter$;
添加回答
舉報
0/150
提交
取消