Как я могу применить рефакторинг "метод перемещения" с IntelliJ IDEA? - PullRequest
22 голосов
/ 10 марта 2011

Я хочу иметь возможность перемещать метод экземпляра из одного класса в другой класс («Метод Move» из «Рефакторинга Фаулера») в IntelliJ IDEA.К сожалению, когда я пытаюсь "Переместить ..." (cmd: F6), он говорит мне, что "Нет методов, которые имеют ссылочный тип. Хотите сделать метод статическим, а затем переместить?"Я не хочу делать мой метод статичным, я хочу, чтобы он был методом экземпляра для другого класса.

Мой пример кода:

public class TheClass {

  public void doStuff(){
     int i = themethod();
  }

  private int theMethod() {
    System.out.println( "Hello World!" );
    return 0;
  }
}

public class OtherClass {

}

Скажем, я хочу переместить theMethod от TheClass до OtherClass.Существует ли для этого автоматический рефакторинг в IDEA, и если да, то как его применить?

Ответы [ 5 ]

26 голосов
/ 09 ноября 2015

В IntelliJ 14-15 выполните следующие действия:

  1. Поместите курсор на метод ().
  2. нажмите Ctrl / Cmd + F6 (изменить подпись).
  3. Введите новый параметр: Type = TheOtherClass, Name = theOtherClass, Значение по умолчанию = new TheOtherClass ()
  4. Refactor
  5. Затем нажмите F6 (перемещение) и переместите метод в классOtherClass.

В итоге вы получите:

public class TheClass {
    public void doStuff() {
        int i = new TheOtherClass().theMethod();
    }
}
public class TheOtherClass {
    int theMethod() {
        System.out.println("Hello World!");
        return 0;
    }
}
8 голосов
/ 02 ноября 2014

В intellij 13.1 (не знаю в предыдущей версии) это можно сделать с помощью

Выберите Refactor | Экстракт | Делегат в главном меню

но есть "странный" предел, по-видимому: это может быть сделано только с новым вновь созданным классом. Поэтому вы должны применить этот рефакторинг, не создавая «OtherClass» (он будет создан непосредственно при применении рефакторинга).

Таким образом, реальный "ход" метода в классе, созданном ранее, кажется отсутствующим, довольно странное поведение

7 голосов
/ 10 марта 2011

Рефакторинг метода Move в IDEA рассматривает только перемещение метода в связанные с ним классы, то есть используемый в качестве его параметра или возвращаемого значения или вызываемый изнутри метода.Что логично: если метод не имеет ничего общего с целевым классом, почему он должен быть там?OTOH Я нашел это ограничение в некоторых случаях, когда у меня все еще была веская причина для перемещения метода.Поэтому я должен был сделать это вручную.

1 голос
/ 02 марта 2017

если theMethod () не имеет ничего общего с классом хоста (TheClass), вы можете сделать этот метод статическим и затем использовать команду "Move". После перемещения метода в целевой класс вы должны удалить ключевое слово static.

0 голосов
/ 16 декабря 2017

Есть еще один метод.Представьте, что у вас есть код:

public int field;

public void foo(int a) {
    assert field == a;
}

И вы хотите сделать foo статическим.Выберите все тело метода и нажмите Alt + Ctrl + M (метод Extract).Введите то же имя метода.Установите флажок «Объявить статический» (доступно только в том случае, если метод только читает и не изменяет поля) и нажмите Ok.Таким образом, вы получите:

public void foo(int a) {
    foo(a, field);
}

private static void foo(int a, int field) {
    assert field == a;
}

Переместите статический метод куда хотите и используйте тело старого foo для его вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...