son - Referencia de objeto de lista modificada durante el bucle de Java
parametros por valor y por referencia (2)
En realidad, hay dos preguntas:
Quiero saber si es seguro cambiar la referencia para la clase de lista durante un ciclo como el siguiente:
Si, es seguro. Y por seguridad me refiero a que cambiar la referencia no interfiere con el ciclo que ya se está ejecutando.
¿El iterador se restablece y comienza de nuevo para la nueva referencia?
No, el iterador nunca se reinicia. Sería exactamente lo contrario de lo seguro.
En mi opinión, no es una buena práctica cambiar las variables del iterador o de la colección dentro de un ciclo. Hace que el código sea más difícil de entender, y probablemente el resultado no sea el esperado cuando haces eso (como en tu caso entendí que esperabas que el ciclo comenzara de nuevo a reevaluar la colección).
En su caso, encapsule en un método y recursivamente llámelo en el subárbol:
Tree findMinimalTree(Tree tree) {
for (Tree st : tree.getSubtrees()) {
if (condition)
return findMinimalTree(st);
}
return tree;
}
No pude encontrar ningún tema sobre esto. Quiero saber si es seguro cambiar la referencia para la clase de lista durante un ciclo como el siguiente:
Tree minimalTree = someTree;
for (Tree st : minimalTree.getSubtrees()) {
if (condition)
minimalTree = st;
}
¿El iterador se restablece y comienza de nuevo para la nueva referencia?
Editar: Olvidé decir: este código es adecuado para situaciones en las que quiero restringir la búsqueda de elementos en el árbol, digamos, el árbol más pequeño que contiene ciertos elementos. En este caso, sería más rápido seguir buscando solo las estructuras internas de "minimalTree" en lugar de toda la estructura "someTree".
No, la iteración no se restablecerá. De acuerdo con el JLS :
El enunciado mejorado para es equivalente a una declaración básica para el formulario:
for (I #i = Expression.iterator(); #i.hasNext(); ) { {VariableModifier} TargetType Identifier = (TargetType) #i.next(); Statement }
La definición hace obvio que el iterador solo se inicializa una vez, antes de la primera iteración del ciclo.
El comportamiento al iterar a través de una matriz con una instrucción for mejorada es similar a este respecto.
Sin embargo, yo personalmente lo considero una mala práctica, ya que hace que el código sea difícil de entender.