2010-12-24 17 views

risposta

9

Rimuovere la parola chiave "statica" e quindi eseguire il refactoring "Metodo di spostamento". Dovrebbe offrire "Bar" come classe target.

(Mi sembra pazzesco che Eclipse lo faccia solo per metodi non statici, ma funziona così. Sembra un bug per me Forse dovrei dare un contributo per risolverlo, invece di lamentano ;-)

+0

+1 Questo dovrebbe essere la risposta accettata ma temo di aver già taggato l'altra –

+0

+1 da me, @ peter.murray.rust - per favore vai avanti e accetta questa. (puoi semplicemente cliccare sulla casella vuota di questo per cambiare quale è accettato) È più importante che la risposta migliore venga accettata al più presto –

+0

Questo non funziona per me su Eclipse Mars: cancello la parola chiave 'static' e poi (se salvo la f ile o no) quando provo * Refactor | Sposta *, Eclipse mi dice "Questo metodo non può essere spostato, poiché non sono stati trovati bersagli possibili". Sto sbagliando? –

4

Non credo ci sia un modo completamente automatizzato per fare questo, ma quello che vorrei fare è quello di rendere il corpo di Plugh.foo() chiamata bar.foo(), quindi utilizzare Quick Fix (controllo-1) per creare Bar.foo(), quindi tagliare & pasta il (resto del) corpo di Plugh.foo() in Bar.foo().

Poi in linea tutte le chiamate al Plugh.foo(), e fare una prima assegnazione all'interno Bar.foo(): Bar bar = this;, quindi inline del locale (e, probabilmente, ripulire tutte le this. 's nel metodo).

+1

+1 Grazie. Le tue idee sono sicuramente migliori di quelle che faccio attualmente. Peccato: sembra una cosa abbastanza importante da implementare (in fondo alcuni altri linguaggi hanno un argomento 'self' invece di' this' e questo è più o meno quello che stiamo facendo –

+0

Potrebbe essere più facile spostare prima il metodo statico, come un metodo statico, per Bar. Quella mossa è un refactoring automatico, e la conversione da statico sembra un po 'più pulita, anche se non riesco a indicarne i motivi. –

+0

vedi anche @JeffGrigg che sembra più pulito –

0
  1. modificare il codice a questo:!

    class Plugh { 
        static void foo(Bar bar) { bar.foo(); } 
    } 
    
  2. Poi inline il metodo Plugh.foo(...).
    Tutte le chiamate di Plugh.foo(...) saranno sostituite da barInstance.foo();.
    barInstance può essere chiamato qualsiasi cosa nel codice chiamante. Sarà correttamente sostituito.