2011-10-28 19 views
10

Chicos, aquí está mi problema: tengo una clase que se usa en muchos lugares de mi proyecto. Y debo reemplazar esta clase con otra del frasco provisto. ¿Hay alguna forma de refactorizar esto? Supongo que este es un problema simple, pero no sé cómo resolverlo.¿Hay alguna manera de reemplazar la clase por otra en Intellij Idea?

No se trata de reemplazar el código fuente; lo que quiero es reemplazar todos los usos de clase por clase de mi biblioteca y poder eliminar completamente mi propia clase. Imagine que he creado mis propios StringUtils y he descubierto que hay una biblioteca StringUtils de apache.common, y ahora quiero usarla en todas partes de mi código. Y las firmas de los métodos de clase no son un problema: coinciden.

?

+3

Una sustitución global en la declaración de importación lo hará. – duffymo

+1

La sustitución global solo funcionaría si el nombre de la clase es el mismo, seguramente. Así que supongo que podría responder a este caso específico, pero no respondería a "la pregunta" ... – Trejkaz

Respuesta

0

Aunque no soy un experto en IntelliJ, puedo decir que generalmente en Java la carga de clases se realiza secuencialmente. Me refiero a que el cargador de clases está buscando clases de forma secuencial, por lo que si la misma clase se presenta varias veces en la ruta de clase, tomará la primera versión.

Por lo tanto, depende de cómo está ejecutando su aplicación. Si, por ejemplo, está utilizando una línea de comandos como java -cp lib.jar;myapp.jar com.mycompany.Main y tanto lib.jar como myapp.jar contienen la misma clase Util, se utilizará la versión de lib.jar.

Si desea lograr el mismo efecto cuando se ejecuta desde IDE intente comprobar las propiedades del proyecto. ¿Probablemente puede controlar el orden de las jarras de la biblioteca en relación con las clases de su proyecto? De lo contrario, probablemente pueda agregar jar a bootstrap classpath. En este caso, agregue su lib.jar a bootstrap classpath (solo para trabajar en su IDE).

Buena suerte.

1

La manera más simple es escribir un método que mapee lo que le gustaría alinear.

Digamos que tienes un método

enum MyStringUtils { 
    public static boolean containsAnyCase(String searchFor, String searchIn) { 
     // something 
    } 
} 

// calling code 
boolean found = MyStringUtils.containsAnyCase(find, in); 

Desea utilizar StringUtils.containsIgnoreCase sin embargo el nombre de clase, nombre del método y orden argumentos son diferentes.

Así que cambia el cuerpo del método para llamar al método deseado.

public static boolean containsAnyCase(String searchFor, String searchIn) { 
     return StringUtils.containsIgnoreCase(searchIn, searchFor); 
    } 

Seleccione el método y < Ctrl> + < Alt> + N. Esto ofrecerá a Inline este método elimina todas partes y su método. La persona que llama ahora se ve como

boolean found = StringUtils.containsIgnoreCase(in, find); 

Esto funciona incluso si la clase original utiliza un import de la clase, import static del método o no tiene importancia en absoluto.

3

Si está utilizando métodos estáticos (como sus StringUtils ejemplo sugiere), delegar en la nueva clase en su aplicación anterior como

public static String myOldMethod(String argument) { 
    return MyNewClass.myNewMethod(argument); 
} 

a continuación, seleccione Refactor-> En línea y seleccione "Todas las invocaciones y retire el método "en el cuadro de diálogo de opciones. De esta manera puede manejar los cambios de nombre de método y los cambios de orden de argumento son buenos.

18

Existe esta función "migrate". Haga clic derecho en cualquier clase -> Refactorizar -> Migrar.

Es un poco molesto que tenga que crear un nuevo conjunto de migrar y no puede ejecutarlo desde cero. Pero hace exactamente lo que necesitas.

Usted elija la clase o paquete para migrar y dígale qué clase o paquete debería cambiar. Presione ejecutar y se reescriben todos los usos. Entonces puedes borrar la clase anterior porque no habrá usos.

¡Salud!

+1

Herramienta ordenada, pero sorprendentemente es trabajo manual para un ayudante IntelliJ. –

+0

Siempre pensé que estas "migraciones" se habían solucionado y nunca pensé que pudieran personalizarse así ... no es el mejor diseño de UX aquí, -) – Gregor

Cuestiones relacionadas