2011-03-10 6 views
19

Quiero ser capaz de mover un método de instancia de una clase a otra clase ("Mover método" de Fowler "Refactorización") en IntelliJ IDEA. Lamentablemente, cuando intento "Mover ..." (cmd: F6), me dice que "No hay métodos que tengan un tipo de referencia. ¿Desea que el método sea estático y luego se mueva?" No quiero que mi método sea estático, sino que quiero que sea un método de instancia en la otra clase.¿Cómo puedo aplicar la refacturación del "método de traslado" con IntelliJ IDEA?

Mi código de ejemplo:

public class TheClass { 

    public void doStuff(){ 
    int i = themethod(); 
    } 

    private int theMethod() { 
    System.out.println("Hello World!"); 
    return 0; 
    } 
} 

public class OtherClass { 

} 

decir que quiero mover theMethodTheClass-OtherClass. ¿Existe una refacturación automática en IDEA para esto? De ser así, ¿cómo lo aplico?

Respuesta

8

La refacturación del método Move en IDEA solo considera mover el método en clases relacionadas con él, es decir, usarlo como su parámetro o valor de retorno, o invocar desde dentro del método. Lo cual es un poco lógico: si el método no tiene nada concreto que ver con la clase objetivo, ¿por qué debería estar allí? OTOH Encontré esta limitación en algunos casos donde todavía tenía una razón válida para mover el método. Así que tuve que hacerlo a mano.

8

En IntelliJ 13,1 ('no saber en la versión anterior) que se podía hacer con el

Elija Refactor | Extracto | Delegar en el menú principal

pero aparentemente hay un límite "extraño": podría hacerse solo con una nueva clase recién creada. Así que tiene que aplicar esta refactorización sin crear la "OtraClase" (se creará directamente cuando aplique la refactorización).

lo tanto, un verdadero "movimiento" del método en una clase creada todavia parece que falta, bastante extraño Comportamiento

20

En IntelliJ 14-15 haga lo siguiente:

  1. Coloque el cursor sobre theMethod().
  2. Presione Ctrl/Cmd + F6 (Cambiar firma).
  3. introducir nuevos parámetros: Tipo = TheOtherClass, Name = theOtherClass, valor por defecto = new TheOtherClass()
  4. Refactor
  5. A continuación, pulse F6 (mover) y mover el método a theOtherClass.

Usted va a terminar con:

public class TheClass { 
    public void doStuff() { 
     int i = new TheOtherClass().theMethod(); 
    } 
} 
public class TheOtherClass { 
    int theMethod() { 
     System.out.println("Hello World!"); 
     return 0; 
    } 
} 
+2

Exactamente lo que estaba buscando. ¡Gracias! –

+1

Lo mismo aquí. Esta debería ser la respuesta aceptada. O más como IntelliJ debería juntar su mierda, para que los usuarios no tengan que recurrir a trucos como este;) –

+0

Si usa _Use Any Var_ cuando introduce el nuevo parámetro, IntelliJ buscará una instancia existente de la clase introducida y Usa ese en lugar de crear uno nuevo. Potente, pero también peligroso, así que ... ten cuidado. – Maarten

0

si theMethod() hace referencia nada a la clase de acogida (theClass), puede hacer que este método estático y luego usar "Mover" de comandos. Después de mover el método a la clase objetivo, debe eliminar la palabra clave estática.

0

Hay otro método. Imagine que tiene el código:

public int field; 

public void foo(int a) { 
    assert field == a; 
} 

Y desea hacer foo estática. Selecciona todo el cuerpo del método y presiona Alt + Ctrl + M (Método de extracción). Escriba el mismo nombre del método. Marca la casilla de verificación "Declarar estático" (disponible solo si el método solo lee y no modifica los campos) y presiona Ok.Por lo que se obtiene: método

public void foo(int a) { 
    foo(a, field); 
} 

private static void foo(int a, int field) { 
    assert field == a; 
} 

Mover estática donde quiera y usar el cuerpo antiguo de foo llamarlo.

Cuestiones relacionadas