Рефакторинг IntelliJ во встроенный класс избыточных данных - PullRequest
2 голосов
/ 04 октября 2019

Существует ли последовательность автоматического рефакторинга IntelliJ, которая избавит от лишнего класса Foo?

До рефакторинга:

  public static class Foo {
    private final String s;
    public Foo(String s) {
      this.s = s;
    }

    public String getS() {
      return s;
    }
  }

  private static void run() {
    Foo f = new Foo("blah");
    f.getS().length();
    f.getS().getBytes();

    Foo f2 = new Foo("blahg");
    f2.getS().length();
    f2.getS().getBytes();
  }

После рефакторинга:


  private static void run() {
    String f = "blah";
    f.length();
    f.getBytes();

    String f2 = new "blahg";
    f2.length();
    f2.getBytes();
  }

Причиной автоматического рефакторинга в моем конкретном случае является то, что в реальной жизни Foo используется несколько тысяч раз. Но мне тоже просто интересно. Довольно просто перевести прокси-объект в состояние Foo с помощью других автоматических шагов, но я просто не могу понять, как проделать последний шаг.

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Более безопасный способ сделать это - использовать структурную замену

  • поиск структурной замены в меню
  • введите $Instance$.getS().$MethodCall$($Parameter$) в поле поиска
  • добавьте фильтр в $ Instance $, чтобы быть только экземплярами Foo
  • , замените на: $Instance$.getS().$MethodCall$($Parameter$)
  • После этого вы можете продолжить структурную замену и найти все экземпляры и заменить их, но этопроще просто запустить Migrate и создать пользовательскую карту типов из класса Foo в 'String`
  • , если вы хотите снова использовать структурную замену, вы можете использовать что-то подобное для поиска и замены
    • Foo $name$ = new Foo($Parameter$);
    • String $name$ = $Parameter$;
2 голосов
/ 04 октября 2019

Не уверен, как это будет работать в более общей настройке, но я бы:

  • Refactor Foo, чтобы изменить имя getS на что-то очень отличное, например XXXXXXXXX

  • Строка заменяет .XXXXXXXXX() пустой строкой

  • Regex stringn заменяет Foo (\w+) = new Foo\("(\w+)"\); на String $1 = "$2";

Это касается всего, что есть в методе run. Теперь вам просто нужно вручную удалить Foo, который хотя и не является рефакторингом IntelliJ, но его нужно будет сделать только в одном месте, что может быть приемлемо.

...