Eclipseリファクタリング操作:変数参照をメソッド参照に変更する



Eclipseのリファクタリングには様々な物があり、大変便利なのだが、ときには「どうしてこれが無いのか?」と思うこともある。

その一つが「変数参照をメソッド参照に変換する」ことだ。

問題

public class Sample {
  public int foo;
}

というクラスがあり、あちこちで以下のように参照している。非常に多数の場所だ。

Sample sample = ...
int value = sample.foo;
sample.foo = 1234;

これを以下に変換したい。

public class Sample {
  private int foo;
  public int getFoo() { return foo; }
  public void setFoo(int value) { foo = value; }
}
....
int value = sample.getFoo();
sample.setFoo(1234);

これを自動的にやれというのは無茶なのかもしれないが、ともあれ最小限の手間でこれを行いたいわけだ。

解決方法

現在のところ思いついた、最短の方法としては以下だろうか。今後より良い方法があれば、改良していくつもりだ。

フェーズ1:どこにも一致しない奇妙な名前に変更する。

Eclipseのリファクタリング機能を使用し、対象の変数をどこにも一致しないような名前に変更する。すると、参照箇所はすべてその名前に自動で変更される。

public class Sample {
  public int foo__1__;
}
....
Sample sample = ...
int value = sample.foo__1__;
sample.foo__1__ = 1234;

フェーズ2:一律にメソッド呼び出しに変更する

Eclipseの複数ソース間にまたがる置換機能(後述)により、変数名をメソッド呼び出しに変更する。

この場合は「foo__1__」を「getFoo()」に変更する。

public class Sample {
  public int getFoo();
}
....
Sample sample = ...
int value = sample.getFoo();
sample.getFoo() = 1234;

もちろん、値の読み出し以外の箇所は手作業で変更しなければならないのだが、それが少数である場合は十分省力化にはなる。

複数ソース間にまたがる置換操作

複数のJavaソース間にまたがる置換操作のやり方は以下の通り。

Search>Fileメニューを選択する

検索文字列その他を設定し、Replaceをクリックする。

置換文字列を入力する。