ventajas usar son qué interfaces implementacion genericas funcionales ejemplos cuando clases java generics refactoring intellij-idea automated-refactoring

java - usar - Implementación automática de la interfaz no genérica.



ventajas de usar interfaces en java (5)

Tengo interfaz

public interface ObjectBuilder<E> { E buildObject(); }

Además, el proyecto tiene muchas clases que implementan una versión no genérica de la interfaz.

class MyClassBuilder implements ObjectBuilder { public MyClass buildObject() {/**/} }

¿Es posible convertir automáticamente todas estas clases, de modo que hayan implementado una versión genérica de la interfaz?

auto refactorización a esto:

class MyClassBuilder implements ObjectBuilder<MyClass> { public MyClass buildObject() {/**/} }

¿Hay una IDEA integrada o complementaria de Intellij IDEA? ¿O en otro IDE?


¿Es posible convertir automáticamente todas estas clases, de modo que hayan implementado una versión genérica de la interfaz?

Sí, es posible, para la definición apropiada de "auto" :)

¿Hay una IDEA integrada o complementaria de Intellij IDEA? ¿O en otro IDE?

La transformación que estás buscando es bastante compleja:

for each class (interface) that implements ObjectBuilder (not ObjectBuilder<.*>) if the class declares/defines the method buildObject with return type X then modify the class to implement ObjectBuilder<X> instead of ObjectBuilder.

Probablemente pueda escribir un complemento para hacer esto, pero sospecho que no hay un complemento que salga y tenga un lenguaje de script lo suficientemente expresivo como para describirlo.

Por otro lado, un script codificado no parece difícil en absoluto. No tengo ninguna experiencia con IntelliJ IDEA, pero puedo ver cómo se puede hacer esto incluso utilizando la búsqueda / reemplazo simple en Emnacs Lisp.


Lo que haría: buscar implements ObjectBuilder y reemplazar automáticamente todas las apariciones con algo que no compila, como

implements ObjectBuilder<FIXME>

A continuación, intente compilar y corregir manualmente todos los saltos. Eso probablemente sería más rápido que tratar de usar un método más avanzado ...


NetBeans ofrece una función llamada Inspeccionar y Transformar , que le permite escribir inspecciones y transformaciones personalizadas , de la forma:

<source-pattern> :: <conditions> => <target-pattern> :: <conditions> ;;

Por ejemplo:

$f.toURL() :: $f instanceof java.io.File => $f.toURI().toURL() ;;

Puedes encontrar más ejemplos de tales transformaciones en una publicación de blog .

De manera similar, IntelliJ admite reglas de transformación de código personalizadas a través de una función llamada Búsqueda y reemplazo estructural . Usando esta característica de IntelliJ, puede hacer transformaciones como las siguientes:

class $TestCase$ extends TestCase { $MyClassContent$ } => class $TestCase$ extends OurHomeGrownTestCase { $MyClassContent$ }

Sin embargo, no estoy seguro de si los lenguajes de las reglas anteriores son lo suficientemente expresivos como para respaldar la transformación deseada. Si no pueden expresar su transformación, siempre puede recurrir a la API de refactorización de un IDE para automatizar su transformación personalizada, por ejemplo:


Probablemente le interesaría el Programa de Sistemas de Transformación .

Estas herramientas le permiten indicar cambios en el código en términos de patrones de código fuente: "si ve esto , entonces reemplácelo por". (Esto es algo así como una "búsqueda y reemplazo estructural programable" mencionado en otra respuesta). Las herramientas más sólidas en esta categoría proporcionan información sobre los tipos ("tablas de símbolos") y la ponen a disposición para controlar las transformaciones (seguramente lo necesitará porque solo está interesado en aplicar cambios a entidades relacionadas con una interfaz específica)

Dichas herramientas también permiten la metaprogramación, para secuenciar la aplicación de tales transformaciones. Con estas dos ideas, uno puede implementar herramientas para realizar cambios "masivos" como el que usted contempla.