あえてインナークラスに向かってリファクタリングしたい状況があるとする。
package test; public class Foo { } package test; public class Hoge { public static void hoge() { } } package test2; import test.Hoge; public class Main { public static void main(String[] args){ Hoge.hoge(); } }
この状態から、Fooクラスの中にHogeクラスを移動したいとする。
eclipseのリファクタリングにはインナークラスへのリファクタリングが無いため、手順としては
1、Fooの中に空のHogeクラスを作成する。 2、メソッドの移動で、HogeクラスのメソッドをFooの中のHogeクラスに移動する。
の2ステップ。
これでうまく行くが、悲しいことにMainクラスがこうなってしまう。
package test2; import test.Hoge; public class Main { public static void main(String[] args){ test.Foo.Hoge.hoge(); } }
この場合、手順増やすことできれいにリファクタできる。
1、Fooの中に空のHoge2クラスを作成する。 2、メソッドの移動で、HogeクラスのメソッドをFooの中のHoge2クラスに移動する。 3、Hogeクラスを削除する。 4、Fooの中のHoge2クラスを、Hogeクラスにリネームする
Hogeクラスを削除しないと、なぜか4の手順でエラーが出る。(たぶんeclipseのバグ)
そのまま無視して進めればうまくリファクタできるが、なにぶん気持ち悪い。
おすすめはこれ。
1、Fooの中に空のHogeクラスを作成する。 2、メソッドの移動で、HogeクラスのメソッドをFooクラスに移動する。 3、Fooクラスのメソッドを、Fooの中のHogeクラスに移動する。
こちらだと元のHogeを削除しなくてもエラーにならない。
上記2つの手順だと、
package test2; import test.Foo.Hoge; public class Main { public static void main(String[] args){ Hoge.hoge(); } }
とリファクタリングされる。
ただ、もしこのようにリファクタリングしたい場合は
package test2; import test.Foo; public class Main { public static void main(String[] args){ Foo.Hoge.hoge(); } }
上記のどの手順でもうまく行かないので、泣く泣くコーディングする必要がある。
enjoy!