varios una objetos misma generar dinamicamente crear con clase bucle automaticamente arreglo array java loops instantiation pmd

java - una - PMD: evite instanciar nuevos objetos dentro de los bucles



crear varios objetos de una misma clase java (2)

Tengo un problema con la regla de PMD Avoid instantiating new objects inside loops . Aquí hay un código de ejemplo:

import java.awt.Dimension; public class PMDDemo { public static void main(final String[] args) { final Dimension[] arr = new Dimension[10]; for (int i = 0; i < arr.length; i++) { arr[i] = new Dimension(i, i); // rule violation here } } }

PMD me da la infracción de regla mencionada anteriormente en el lugar marcado en el código. ¿Cómo se supone que crearé n instancias de una clase sin crearlas dentro de un ciclo?

Sé que algunas de las reglas de PMD son controvertidas (como la única regla de OneExit ). Pero hasta ahora al menos entendí la idea detrás de ellos. No entiendo el razonamiento detrás de esta regla. ¿Puede alguien ayudarme con eso?


Para su caso de uso específico no tiene sentido ya que mantiene la referencia al nuevo Objeto después del ciclo. Entonces no hay una alternativa real a su solución.

En términos más generales, la creación de objetos efímeros en Java es barata * (aparte del costo oculto que el GC ejecutará más a menudo). En particular, la asignación es casi gratuita y el tiempo de GC depende principalmente de la cantidad de objetos accesibles: los objetos muertos no aumentan el tiempo de GC para los algoritmos de GC típicos.

El JIT también puede realizar varias optimizaciones si detecta que se crean objetos innecesarios.

Obviamente, crear inútil no es una práctica recomendada, pero tratar de reutilizar objetos a menudo es contraproducente.

Como ejemplo práctico, puedes echar un vistazo a esta publicación que muestra que crear un nuevo conjunto dentro de un ciclo es más barato que crear uno antes del ciclo y borrarlo en cada iteración.

* Gracias @RichardTingle por el enlace


for (int i = 0; i < arr.length; i++) { arr[i] = new Dimension(i, i); // rule violation here }

La Pmd anterior se puede resolver

for (int i = 0; i < arr.length; i++) { arr[i] = createNewDimension(i,i); // rule violation here } private static Dimension createNewDimension(i,i) { return new Dimension(i, i); }

no deberíamos usar directamente un nuevo operador dentro de un bucle simplemente moverlo dentro de un método privado.