2010-12-24 2 views

ответ

9

Удалите ключевое слово «статическое», а затем выполните рефакторинг «Метод перемещения». Он должен предлагать «Бар» в качестве целевого класса.

(Мне кажется сумасшедшим для меня, что Eclipse делает это только для нестатических методов, но так оно и работает. Кажется, это ошибка. Возможно, мне стоит внести свой вклад, чтобы исправить это, а не просто жалуясь об этом ;-)

+0

+1 Это должно быть принятый ответ, но я боюсь, что я перечеркнул другого. –

+0

+1 от меня тоже, @ peter.murray.rust - пожалуйста, продолжайте и согласитесь с этим. (вы можете просто щелкнуть полый флажок на этом, чтобы изменить –

+0

Это не работает для меня на Eclipse Mars: я удаляю ключевое слово 'static', а затем (сохраняю ли я f ile или нет), когда я пытаюсь * Refactor | Move *, Eclipse говорит мне: «Этот метод не может быть перемещен, поскольку никаких возможных целей не найдено». Я делаю это неправильно? –

4

Я не считаю, что это полностью автоматизированный способ сделать это, но то, что я хотел бы сделать это, чтобы сделать тело Plugh.foo() вызова bar.foo(), а затем использовать Quick Fix (контроль-1) для создания Bar.foo(), а затем вырезать & пасты (остальной части) тела Plugh.foo() в Bar.foo().

Затем инлайн все вызовы Plugh.foo() и сделать первоначальное назначение внутри Bar.foo(): Bar bar = this;, а затем встраивать местные (и, вероятно, очистить все this. «S в методе).

+1

+1 Спасибо. Ваши идеи, безусловно, лучше, чем то, что я сейчас делаю. Жалость - это кажется довольно сложной задачей для реализации (ведь некоторые другие языки имеют вместо аргумента 'self' аргумент' self', и это более или менее то, что мы делаем –

+0

Может быть проще сначала перенести статический метод, так как статический метод, в Bar.Этот ход - это автоматический рефакторинг, а преобразование из статичного просто кажется немного чище, хотя я не могу указать ни на какую причину. –

+0

см. также @JeffGrigg, который кажется чистым –

0
  1. Изменить код этого:

    class Plugh { 
        static void foo(Bar bar) { bar.foo(); } 
    } 
    
  2. Тогда inline метод Plugh.foo(...).
    Все вызовы Plugh.foo(...) будут заменены на barInstance.foo();.
    barInstance можно назвать чем угодно в вызывающем коде. Он будет правильно заменен.

Смежные вопросы