SJ blog
Eclipse
Z

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

Eclipseのリファクタリング機能を使いこなす

Rename、Extract Method、Extract Variableなど、EclipseのリファクタリングメニューをGUIで安全に使う方法を解説します。

一言結論

EclipseのリファクタリングはAlt+Shift+Rのリネームや Alt+Shift+Mのメソッド抽出など全参照を自動追跡して安全に変更するため、手動の検索置換より格段に信頼性が高い。

リファクタリングとは

「外から見た振る舞いを変えずに、内部の構造を改善すること」です。Eclipse はリファクタリング操作を安全に自動実行してくれます。

リファクタリングメニューは Alt+Shift+T で開けます。

Rename(名前の変更)

変数名、メソッド名、クラス名を一括変更します。

// 変更前
int x = calculateTotalPrice();

// 変更後(より意味のある名前に)
int totalPrice = calculateTotalPrice();

手順:

  1. 変数名にカーソルを置く
  2. Alt+Shift+R
  3. 新しい名前を入力してEnter

Eclipse が参照しているすべての箇所を自動で変更してくれます。手動での Ctrl+H 置換より安全です。

Extract Method(メソッドの抽出)

長いメソッドの一部を別メソッドとして切り出します。

// 変更前: 一つのメソッドに処理が詰め込まれている
public void processOrder(Order order) {
    // 検証
    if (order.getItems().isEmpty()) {
        throw new IllegalArgumentException("Items cannot be empty");
    }
    if (order.getTotalPrice() <= 0) {
        throw new IllegalArgumentException("Price must be positive");
    }

    // 送料計算
    double shipping = order.getTotalPrice() > 10000 ? 0 : 500;
    order.setShipping(shipping);

    // 保存
    repository.save(order);
}
// 変更後: 各処理を別メソッドに抽出
public void processOrder(Order order) {
    validateOrder(order);
    calculateShipping(order);
    repository.save(order);
}

private void validateOrder(Order order) {
    if (order.getItems().isEmpty()) {
        throw new IllegalArgumentException("Items cannot be empty");
    }
    if (order.getTotalPrice() <= 0) {
        throw new IllegalArgumentException("Price must be positive");
    }
}

private void calculateShipping(Order order) {
    double shipping = order.getTotalPrice() > 10000 ? 0 : 500;
    order.setShipping(shipping);
}

手順:

  1. 抽出したい範囲を選択
  2. Alt+Shift+M
  3. メソッド名を入力

Extract Variable(変数の抽出)

複雑な式や何度も使う値を変数に切り出します。

// 変更前
if (user.getAge() >= 18 && user.getAge() < 65 && user.isRegistered()) {
// 変更後
boolean isEligibleAge = user.getAge() >= 18 && user.getAge() < 65;
boolean isEligible = isEligibleAge && user.isRegistered();
if (isEligible) {

手順:

  1. 式を選択
  2. Alt+Shift+L
  3. 変数名を入力

Inline(インライン展開)

変数やメソッドを展開して元に戻します。Extract の逆操作です。

// 変更前
boolean isEligible = user.getAge() >= 18;
if (isEligible) { ... }

// 変更後(インライン展開)
if (user.getAge() >= 18) { ... }

手順:

  1. 変数名にカーソルを置く
  2. Alt+Shift+I

Move(移動)

クラスを別パッケージに移動します。インポート文も自動更新されます。

  1. クラス名を右クリック
  2. Refactor > Move
  3. 移動先パッケージを選択

Change Method Signature(シグネチャの変更)

引数の追加・削除・並び替えを安全に行います。

  1. メソッド名にカーソル
  2. Alt+Shift+C
  3. ダイアログで引数を編集

Pull Up / Push Down(継承関係での移動)

  • Pull Up: サブクラスのメンバーをスーパークラスへ移動
  • Push Down: スーパークラスのメンバーをサブクラスへ移動

継承構造の整理に使います。

リファクタリング履歴と元に戻す

Edit > Undo Refactoring で直前のリファクタリングを一括取り消しできます(複数ファイルにまたがる変更も)。

まとめ

操作ショートカット使いどころ
RenameAlt+Shift+R名前を意味のあるものに
Extract MethodAlt+Shift+M長いメソッドを分割
Extract VariableAlt+Shift+L複雑な式を明確に
InlineAlt+Shift+I不要な変数を削除
Moveコンテキストメニューパッケージ整理

リファクタリングは「一度にたくさんやらない」のがコツです。小さく確実に進めましょう。