2010-12-24 1 views

Antwort

9

Entfernen Sie das Schlüsselwort "static" und führen Sie dann das Refactoring "Move Method" durch. Es sollte "Bar" als Zielklasse anbieten.

(Es scheint mir verrückt zu sein, dass Eclipse das nur für nicht-statische Methoden tut, aber so funktioniert es. Scheint wie ein Fehler für mich. Vielleicht sollte ich einen Beitrag aufbessern, anstatt nur beschwerte sich über es ;-)

+0

+1 Dies sollte sein die angenommene Antwort, aber ich fürchte, ich habe die andere getaggt. –

+0

+1 von mir auch, @ peter.murray.rust - bitte gehen Sie weiter und akzeptieren Sie diese. (Sie können einfach auf die leere Kontrollkästchen an dieser ändern) welches akzeptiert wird) Es ist wichtiger, die beste Antwort als die früheste zu akzeptieren –

+0

Dies funktioniert nicht für mich auf Eclipse Mars: Ich lösche das 'static' Schlüsselwort und dann (ob ich die f ile oder nicht), wenn ich * Refactor | versuche Bewegen *, Eclipse sagt mir "Diese Methode kann nicht verschoben werden, da keine möglichen Ziele gefunden wurden." Mache ich es falsch? –

4

Ich glaube nicht, gibt es eine vollautomatische Art und Weise, dies zu tun, aber was würde ich tun, ist der Körper von Plugh.foo() Anruf bar.foo(), dann Quick Fix (control-1) Bar.foo() erstellen verwenden zu machen, schnitt dann & Paste der (Rest) des Körpers von Plugh.foo() in Bar.foo().

Dann inline alle Anrufe zu Plugh.foo() und tun eine anfängliche Zuweisung innerhalb Bar.foo(): Bar bar = this;, dann den lokalen Inline (und wahrscheinlich alle this. ‚s in dem Verfahren aufzuräumen).

+1

+1 Danke. Ihre Ideen sind sicherlich besser als das, was ich derzeit mache. Schade - es scheint eine recht stringente Sache zu sein, die es zu implementieren gilt (schließlich haben einige andere Sprachen ein 'self' Argument anstelle von' this' und das ist mehr oder weniger was wir machen –

+0

Es mag einfacher sein, zuerst die statische Methode zu verschieben, als eine statische Methode, zu Bar. Diese Bewegung ist ein automatisiertes Refactoring, und die Konvertierung von statischen scheint nur ein wenig sauberer, obwohl ich nicht auf irgendeinen Grund warum. –

+0

siehe auch @JeffGrigg, die sauberer scheint –

0
  1. Code, um diese Änderung

    :

    class Plugh { 
        static void foo(Bar bar) { bar.foo(); } 
    } 
    
  2. inline das Verfahren Plugh.foo(...) dann.
    Alle Anrufe von Plugh.foo(...) werden durch barInstance.foo(); ersetzt.
    barInstance kann alles im aufrufenden Code aufgerufen werden. Es wird ordnungsgemäß ersetzt.