2010-12-24 24 views

Respuesta

9

Elimine la palabra clave "estática" y luego realice la refactorización "Mover método". Debería ofrecer "Bar" como clase objetivo.

(Me parece una locura que Eclipse solo haga esto para métodos no estáticos, pero así es como funciona. Parece un error para mí. Tal vez debería encontrar una contribución para solucionarlo, en lugar de solo quejarse de ello ;-)

+0

+1 Esto debería ser la respuesta aceptada, pero me temo que ya he etiquetado a la otra. –

+0

+1 de mí, también, @ peter.murray.rust - por favor, adelante y acepte ésta. (Puede hacer clic en la casilla de verificación hueca en esta para cambiar cuál es aceptado). Es más importante que se acepte la mejor respuesta que la más temprana. –

+0

Esto no funciona para mí en Eclipse Mars: elimino la palabra clave 'static' y luego (si guardo el f ile o no) cuando intento * Refactor | Move *, Eclipse me dice "Este método no se puede mover, ya que no se han encontrado posibles objetivos". ¿Lo estoy haciendo mal? –

4

No creo que hay una manera totalmente automatizada para hacer esto, pero lo que yo haría es hacer que el cuerpo de Plugh.foo() llamada bar.foo(), a continuación, utilizar Quick Fix (control-1) para crear Bar.foo(), luego se corta & pasta el (resto de) el cuerpo de Plugh.foo() en Bar.foo().

A continuación, todas las llamadas a línea Plugh.foo(), y hacer una asignación inicial dentro Bar.foo(): Bar bar = this;, a continuación, el inline local (y, probablemente, limpiar todos los this. 's en el método).

+1

+1 Thanks. Tus ideas son ciertamente mejores de lo que hago actualmente. Lástima: parece bastante sencillo de implementar (después de todo, algunos otros lenguajes tienen un argumento 'self' en lugar de 'this' y eso es más o menos lo que estamos haciendo –

+0

Puede ser más fácil mover primero el método estático, ya que un método estático, para Bar. Ese movimiento es una refactorización automática, y la conversión de estática parece un poco más limpia, aunque no puedo señalar ningún motivo. –

+0

vea también @JeffGrigg que parece más limpio –

0
  1. cambiar el código para esto:!

    class Plugh { 
        static void foo(Bar bar) { bar.foo(); } 
    } 
    
  2. Entonces inline el método Plugh.foo(...).
    Todas las llamadas de Plugh.foo(...) se reemplazarán por barInstance.foo();.
    barInstance se puede llamar cualquier cosa en el código de llamada. Será apropiadamente reemplazado.

Cuestiones relacionadas