Подтвердить что ты не робот

Как я могу применить рефакторинг "метод перемещения" с помощью IntelliJ IDEA?

Я хочу, чтобы иметь возможность перемещать метод экземпляра из одного класса в другой класс ( "Метод перемещения" из Fowler "Рефакторинг" ) в 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, и если да: как его применить?

4b9b3361

Ответ 1

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

Ответ 2

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

  • Расположите каретку на методе().
  • нажмите Ctrl/Cmd + F6 (сменить подпись).
  • Ввести новый параметр: Type = TheOtherClass, Name = theOtherClass, Значение по умолчанию = new TheOtherClass()
  • Refactor
  • Затем нажмите F6 (переместить) и переместите метод в папку "Очередь".

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

public class TheClass {
    public void doStuff() {
        int i = new TheOtherClass().theMethod();
    }
}
public class TheOtherClass {
    int theMethod() {
        System.out.println("Hello World!");
        return 0;
    }
}

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

Существует другой метод. Представьте, что у вас есть код:

public int field;

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

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

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

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

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