java generics migration legacy-code

java - Genéricos en código heredado



generics migration (5)

Ante un desafío similar, optamos por actualizar a genéricos de estilo Java 5 solo en el código que se editó por otro motivo. Por lo tanto, si tiene un error que reparar en DoItFast.java, actualice DoItFast.java para usar los genéricos de estilo Java 5. Las áreas del código que se editan y cambian con regularidad se actualizarán rápidamente. Después de algunas semanas o meses de este comportamiento, puede reevaluar la condición de su base de código.

Si eso no hace el trabajo lo suficientemente rápido para ti, a veces usaré el tiempo lento después del almuerzo para simplemente limpiar algunas clases y acelerar el proceso.

Tenemos una cantidad bastante grande de código que acaba de dar el salto a Java 5. Hemos estado utilizando genéricos en aquellos componentes destinados a ser lanzados en la versión de Java 5, pero el código restante está, por supuesto, lleno de materias primas tipos. Establecí el compilador para que genere un error para los tipos sin formato y comencé a borrarlos manualmente, pero al ritmo actual llevará mucho tiempo llevarlo a cabo (hay unos 2500 errores). Y eso es con la solución rápida Infer Generic Type de Eclipse, que siempre elimina los errores, pero a menudo genera código que necesita más trabajo.

¿Hay alguna forma mejor de lidiar con esto? ¿Hay alguna herramienta automatizada mejor que Eclipse? ¿Alguna forma de aplicar la refactorización a todas las ocurrencias en lugar de hacerlas una a una? ¿O simplemente ignoras las advertencias?


Entiendo que con IDEA puede seleccionar todas sus clases, abrir el menú contextual y seleccionar Refactor | Generificar Trabajo hecho. Ciertamente, es una experiencia más agradable trabajar con código genérico (IMO).


No creo que sea necesario actualizar todo el código anterior. ¿Tal vez si pudieras identificar de alguna manera qué partes del código antiguo se usan con frecuencia, y solo actualizarlas para usar tipos genéricos? ¿O tal vez solo podría preocuparse cuando el tipo sin procesar sea devuelto por una función pública? Muchos de estos casos son probablemente solo variables privadas / locales, que ya están escritas sin tipos genéricos y presumiblemente funcionan bien, por lo que probablemente no valga la pena el esfuerzo de reescribirlas.


Por lo que sé, lo estás haciendo lo más eficientemente posible. Obviamente no es perfecto, pero terminarás eventualmente.

Sin embargo, te recomiendo que lo hagas por etapas; hay partes probables del código que se beneficiarían más de esto que otras, concéntrese en ellas. Tratar de hacerlo todo de una sola vez corre el riesgo de introducir nuevos errores en su código. Tenemos uno de esos lugares donde tenemos una colección que contiene datos dependientes del contexto, y los genéricos en realidad no pueden funcionar.

Básicamente, haz lo que estás haciendo, pero hazlo por etapas como parte de otro trabajo, en lugar de tratar de arreglarlo todo de una sola vez.


Sugeriría ignorar las advertencias. De lo contrario, dedicará mucho tiempo a actualizar el código heredado sin realizar ninguna mejora en su funcionalidad.

Actualización: Gran comentario de Luke que pensé que debería tener más visibilidad: "Los genéricos son una forma de detectar errores de tiempo de ejecución en tiempo de compilación. A menos que este código heredado tenga errores que creas que están relacionados con el casting, lo dejaría en paz (si no está roto, no lo arregles) "