java - interfaz - ¿Una forma simple de crear importaciones estáticas para constantes en el código existente?
interfaz grafica para netbeans (9)
¡La expresión regular fue inventada para resolver problemas como estos! =)
deberá escribir un pequeño script (o usar la búsqueda / reemplazo de expresiones regulares IDE). El único problema es que si hay muchas clases que se deben importar estáticamente, entonces es igual de trabajo. De lo contrario, si es solo una clase como FOO.BLAH, entonces puedes usar una expresión regular como
(/bFOO/.(/w+)/b)
-> reemplace con el grupo 2 ($ 2 o / 2 o sin embargo, su buscador de expresiones regulares captura las sustituciones).
puede intentarlo aquí: http://www.gskinner.com/RegExr/ . Seleccione la pestaña reemplazar y escriba $ 2
Un problema puede surgir si tienes expresiones como esta: FOO f = FOO.blah + "FOO.blah"
, así que ten cuidado con eso.
En cuanto a la declaración de importación en la parte superior del archivo, eclipse tiene una función de importación automática en la que se importa automáticamente en el formato, y funciona siempre que el nombre de la importación sea lo suficientemente único. O bien, si no puede usarlo porque el nombre es demasiado común, puede usar un script de Perl para hacer la expresión regular en su lugar y anteponer las importaciones estáticas.
Si tengo un BAR constante en Foo, que usaré en una clase C, tendré que escribir
Object o = Foo.BAR + "...";
que puedo usar Ctrl-Shift-M en Eclipse (con el cursor en BAR) para crear una importación estática para me gusta:
import static Foo.BAR;
Object o = BAR + "....";
Actualmente estoy actualizando el código heredado con literalmente miles de estos que me gustaría convertir a importaciones estáticas. Ctrl-Shift-O / Organize imports no lo hace. ¿Hay algún truco que me haya perdido?
EDITAR: En realidad, lo que preferiría es una forma de decirle a Eclipse que quiero que Ctrl-Shift-M haga su magia en TODAS las instancias de esta clase en particular en lugar de la única instancia en la que coloque el cursor. (Es código heredado por lo que esto realmente MEJORA la legibilidad :))
EDITAR: He descubierto que IntelliJ sugiere hacer esto.
Asegúrate de que no haya conflictos con otras clases constantes
reemplace todo el "Foo". con vacío ("")
usa esta línea en la parte superior. trabajó para mi
importar Foo estático. *
Bueno, algo que aparece como una solución. Yo recomendaría usar un guión groovy simple. Básicamente, la semántica está relacionada con el análisis de las declaraciones de importación y los archivos a los que hacen referencia. Algunos pasos básicos podrían ser como
- Repetir cada archivo dentro del directorio. Comprobar si la extensión del archivo es .java
- Coincide con cualquier línea que comience con la importación
- Para cada línea, abra el archivo fuente relevante (ya conoce la ruta de la declaración de importación).
- Haga coincidir la declaración de campo / método para un modificador estático usando la reflexión
- Agregue estática después de la instrucción de importación para las coincidencias encontradas en el paso 5.
Si tengo algo de tiempo, intentaré publicar una pequeña secuencia de comandos groovy para hacer lo mismo.
Eclipse puede hacer una búsqueda global y reemplazar con expresión regular sobre todos los archivos en el proyecto.
Para agregar la importación estática al comienzo de todos los archivos, puede reemplazar la declaración del paquete en sí misma más la importación estática.
Luego haga un proyecto de organizar las importaciones, y ya está todo listo.
Tenga cuidado, sin embargo, esto también podría hacer un gran lío si lo hace mal.
No conozco ninguna otra refactorización automatizada para hacer lo que está buscando, pero hay dos aspectos clave para hacer esto: uno es agregar las importaciones y el otro eliminar el nombre de la clase de las constantes.
Para agregar las importaciones, recomiendo pegar la import static application.KeyHolder.*;
después del paquete en cada archivo que los usa.
Para eliminar el nombre de la clase, en eclipse haga una búsqueda Java para KeyHolder.*
Y busque un campo. A continuación, puede hacer un buscar / reemplazar para "KeyHolder". y reemplace con "". Para evitar desajustes, asegúrese de que el recuento de elementos reemplazados sea igual al número de coincidencias para ese archivo. Además, asegúrese de buscar y comenzar después de las importaciones.
No sé si se ajustaría a sus necesidades, pero siempre puede tener estas constantes definidas en una interfaz y hacer que todas sus clases implementen esta interfaz. Luego, utilizando algunos RegExp inteligentes, como otros sugieren que podría deshacerse de todos los Foo.
ocurrencias.
Ejemplo:
public interface Foo {
static final String constant1 = "Some";
static final String constant2 = "Value";
//...
}
Y entonces
public class YourClass implements Foo {
public YourClass() {
System.out.println("Hello " + constant1);
}
}
Si me enfrentara a tal desafío, probablemente escribiría un pequeño programa para hacerlo por mí. Ruby y Python (JRuby y Jython?) Son bastante adecuados para la tarea, aunque también podrías hacerlo en Java.
OK, así que probablemente te llevará al menos la misma cantidad de tiempo que hacerlo a mano, pero al menos te divertirás :).
Suena como una buena idea, pero después de haber cambiado todos los archivos, ¿cuánto mejor serán? Tal vez deberías pensar solo en cambiar los archivos en los que estás trabajando por otros motivos.
Una nota de advertencia: el uso excesivo de importaciones estáticas puede realmente hacer que su código sea menos legible (imho), particularmente si el nombre de la constante no indica claramente la clase o enumeración a la que pertenece. También puede obtener nombres constantes de diferentes clases / enumeraciones que suenan similares o incluso tienen el mismo nombre.
Entonces, lo que le está obligando al lector a hacer es esperar que su IDE le diga la clase (por ejemplo, un consejo sobre herramientas) o que tengan que navegar para averiguar qué es. Las copias impresas y los fragmentos de código se vuelven mucho menos reechables.
Honestamente utilizo las importaciones estáticas extremadamente raramente por estas razones.