インナークラスへのリファクタリング

あえてインナークラスに向かってリファクタリングしたい状況があるとする。

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!