Autor Tema: Qué es un Iterator Java. Implementación de la interface Iterable. CU00912C  (Leído 6357 veces)

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Hola, respecto de la Entrega Nº912 del curso, me gustaría hacer un aporte y una consulta:


Aporte:

El ejercicio resulto de la entega da un Warning cuando uno compila la clase ConjuntoPersonas.
Esta advertencia deja de aparecer si hacemos el siguiente cambio en el método iterator()

Código: [Seleccionar]
public Iterator<Persona> iterator() {   
        Iterator it = new MiIteratorPersona();
        return it;         
    }

por:

Código: [Seleccionar]
public Iterator<Persona> iterator() {
        Iterator<Persona> it = new MiIteratorPersona();
        return it;         
    }

Consulta:

En un párrafo de la entrega se dice:

Citar
Piensa que un iterador viene siendo “un clon” de la colección a recorrer. Es decir, en vez de operar directamente sobre la colección original operamos sobre una copia.

¿ Cuando se dice colección, a qué se refiere ? Porque si se refiere a lo que veníamos llamando colección: un vector, un ArrayList, un LinkedList, cualquier tipo List, etc. entonces por la forma en que vemos está implementada la interface Iterable, me da la sensación que no sería tan así, no es que "en vez de operar directamente sobre la colección original operamos sobre una copia."
Diría más bien que se crea un objeto distinto, pero que al fin y al cabo referencia a la misma coleccion (en el caso del ejemplo resuelto un vector) perteneciente a la clase sobre la cual se implementa la interface Iterable.

No estaríamos creando un "copia de la colección" en donde operar, que ahí si podríamos creo hablar de un clon de la colección.
En este caso sería tener un nuevo objeto (el iterador) que referencia a la colección del objeto cuyo tipo implementa la interface Iterable, pero la colección siempre es la misma (el vector).

¿ Estoy en lo correcto ?

« Última modificación: 18 de Mayo 2015, 17:17 por Alex Rodríguez »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Implementación de la interface Iterable. CU00912C
« Respuesta #1 en: 18 de Mayo 2015, 00:00 »
Perdon no iba aquí mi  comentario, iba en el post que yo inicié que respondiste jeje lo traspaso :)
« Última modificación: 18 de Mayo 2015, 00:04 por Lorenzo31 »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Implementación de la interface Iterable. CU00912C
« Respuesta #2 en: 18 de Mayo 2015, 14:45 »
Hola RaGa, con el warning tienes razón, mejor eliminarlo usando Iterator<Persona> it = new MiIteratorPersona();

Yo interpretaría esto de la siguiente manera:

Citar
Piensa que un iterador viene siendo “un clon” de la colección a recorrer. Es decir, en vez de operar directamente sobre la colección original operamos sobre una copia.

Al usar un iterador, el recorrido de una colección se basa en su estado inicial. Por ejemplo supongamos que la colección inicialmente tiene cinco elementos. Con un iterador el bucle se repetirá cinco veces, incluso si durante el recorrido añadimos nuevos elementos a la colección. Esta adición (o borrado) durante el recorrido no será visible hasta que termine el recorrido de la colección. Con otros tipos de bucles no basados en iterador no ocurre así, pudiendo generarse resultados imprevistos o errores.

En el ejemplo yo no veo que haya "creación de un clon" quizás habría que redactarlo de otra manera.

Saludos

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Muy esclarecedora tu explicación Alex. Muchas gracias.

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Quiero aportar en este hilo un código sobre el que he estado trabajando basado en el ejercicio resuelto de la Entrega Nº912.
La idea es tratar de poder hacer algo modular, dejando la posibilidad de ampliaciones futuras. Y por qué no, hacer código reutilizable en otro momento.
Me interesa poner a consideración estas premisas. Si bien el programa hace lo que tiene que hacer, me interesa saber si estoy en la senda de pensar con la filosfía de POO.

Volviendo al código entonces: la organización está establecida en paquetes.

En el paquete Entidades, se almacenará la clase Persona. Este package podría almacenar en un futuro clases como Profesor, Taxi, Motor, etc. según las necesidades.

Hay otro package que se denomina IteradoresDeEntidades.
En este paquete tenemos una clase llamada CreadorIteradorColeccionesTipoPersona. Esta clase sirve para crear un iterador ya sea sobre un vector, o sobre un objeto tipo List, que contengan objetos Persona.

Llegado el caso que en el paquete Entidades además de la clase Persona, se almacenara una clase llamada Taxi, entonces en el paquete IteradorDeEntidades se crearía la clase CreadorIteradorColeccionesTipoTaxi, que serviría para crear iteradores sobre vectores u objetos tipo List que contengan objetos tipo Taxi.

En la raíz tenemos -por ahora- dos clases de interés: ConjuntoPersonas y ConjuntoPersonas2 (cada una con sus respectivas clase Test).

ConjuntoPersonas es una clase que implementa la interface Iterable y contiene como campo de instancia un vector de objetos Persona.
ConjuntoPersonas2 es una clase que implementa la interface Iterable y contiene como campo de instancia una lista List de objetos Persona.

Como podemos ver (y es el objetivo de este código), crear clases que implementen la interface Iterable sobre colecciones que contengan objetos de tipo Persona se hace mucho más sencillo.

(Los archivos se adjuntan. Loguearse previamente para poder descargarlos).

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola, después de revisar el código me parece que aunque haya detalles que podrían discutirse u organizarse de otra manera, lo importante es que estás haciendo un buen uso de la filosofía de la orientación a objetos, has nombrado bien las clases, haces uso de clases auxiliares para facilitarte el trabajo, organizas el código modularmente con vistas a la ampliación en el futuro y estás haciendo uso de conceptos avanzados como clases privadas, creación de iteradores, etc.

Creo que es un buen aporte y un buen ejemplo para personas que quieran ver ejemplos de organización y utilización de código a este nivel.

Así que mis felicitaciones!

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Pillo sitio, lo descargo y luego comento, aprendiendo de los demás  ;D

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Muchas gracias Alex. Tus observaciones, recomendaciones y correcciones son un gran aliciente.
Me interesa mucho ir avanzar en el lenguaje, poder ir utilizando y relacionando las cosas nuevas con las ya aprendidas, y fundamentalmente ir madurando e incorporando la filosofía de POO.  :)

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".