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

Может ли eclipse конвертировать/реорганизовать метод в класс?

Кажется, что это должно быть довольно прямолинейно, но я не вижу ничего очевидного. Что я в основном хочу сделать, чтобы указать на метод и метод refactor- > extract. Это применило бы этот метод к новому классу с помощью этого метода как API открытого уровня верхнего уровня. Рефакторинг также перетащил бы все необходимые методы и переменные вместе с ним в новый класс, удалив их из старого класса, если ничто в старом классе его не использует.

Это повторяющаяся задача, с которой я часто сталкиваюсь при реорганизации устаревшего кода. Во всяком случае, я в настоящее время использую Eclipse 3.0.2, но все равно будет интересоваться ответом, если он доступен в более новой версии eclipse. Спасибо!

4b9b3361

Ответ 1

Я не думаю, что такой рефакторинг существует.

Ошибка 225716 был зарегистрирован для этой функции (с начала 2008 года).
Ошибка 312347 также будет хорошей реализацией такого рефакторинга.

"Создайте новый класс и переместите соответствующие поля и методы из старого класса в новый класс".

Я упоминаю обходной путь в этом SO-ответе.

Ответ 2

В Eclipse 3.7.1 есть возможность переместить методы и поля из класса. Для этого:

  • Убедитесь, что целевой класс существует (пустой класс в порядке, до тех пор, пока он существует в проекте).
  • В исходном классе выберите методы, которые вы хотите удалить (представление схемы хорошо подходит для этого), щелкните правой кнопкой мыши по выделенной области и выберите "Переместить"
  • Выберите класс назначения в раскрывающемся списке /Browse

Теперь ваши участники извлечены. Исправьте любые проблемы видимости (Source > Generate Getters и Setters очень полезны для этого), и все вы настроены.

Ответ 3

Кажется, что это должно быть справедливо прямолинейная...

Собственно, Extract Class является одним из наиболее сложных рефакторингов. Даже на вашем простом примере перемещения одного метода и его зависимостей возможны следующие осложнения:

  • Если перемещенный метод может использоваться в коде, о котором вы не знаете, вам необходимо иметь прокси-метод в исходном классе, который будет делегировать (вызывать) перемещенный метод. (Если ваше приложение является самодостаточным или если вы знаете всех клиентов перемещенного метода, то код рефакторинга может обновлять вызывающий код.)
  • Если перемещенный метод является частью интерфейса или если перенесенный метод наследуется, вам также понадобится "прокси-метод".
  • Ваш метод может вызвать частный метод/поле, которое вызывает другие вызовы. Вам нужно выбрать класс для вызываемого члена (возможно, в классе, который использует его больше всего). Вам нужно будет изменить доступ с "private" к чему-то более общему.
  • В зависимости от того, насколько первоначальный класс и извлеченный класс должны знать друг о друге, одному или обоим может потребоваться инициализация полей, которые указывают на другой.
  • Etc.

Вот почему я призываю всех голосовать за ошибку 312347, чтобы исправиться.

Ответ 4

Вы пробовали функцию Move группы Refactor? Вы можете создать вспомогательный класс и переместить туда что угодно.