Autor Tema: Java objetos quedan inaccesibles al usar varias veces new en un bucle CU00667B  (Leído 3507 veces)

akira

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Bueno, aquí esta mi solución al ejercicio CU00667B del curso de java:

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;

public class ListaCantantes
{
    // Variables de instancia / atributos / campos
    private ArrayList<CantanteFamoso> listaCantantes;
    private String nombre;
   
    /**
     * Constructor for objects of class ListaCantantes
     */
    public ListaCantantes(String nombre)
    {
        this.nombre = nombre;
        listaCantantes = new ArrayList<CantanteFamoso>();
    }

    /**
     * Métodos
     */
    public void addCantante(CantanteFamoso objeto)
    {
        listaCantantes.add(objeto);
    }
   
    public void copiaValores(){
   
       Iterator<CantanteFamoso> copiaLista = listaCantantes.iterator();
       int indice = 0;
       
       while(copiaLista.hasNext()){
           
           CantanteFamoso cantante = copiaLista.next();
           System.out.println(indice + ") Cantante: " + cantante.getNombre() + " Disco con mas ventas: "
           + cantante.getDisco());
           indice +=1;
        }
    }
   
    public void valoresReales(){
       
        int indice = 0;
       
        for(CantanteFamoso cantante: listaCantantes){
       
            System.out.println(indice + ")" + cantante.getNombre());
            indice ++;
        }
    }
   
}

Código: [Seleccionar]
import java.util.Scanner;

public class CantanteFamoso
{
    // variables de instancia / atributos / campos
    private String nombre;
    private String disco;
   
    /**
     * Constructor
     */
    public CantanteFamoso()
    {
        setNombre();
        setDisco();
    }

    /**
     * Métodos
     */
    public void setNombre(){
       
        System.out.println("Ingrese nombre");
        Scanner entrada = new Scanner(System.in);
        nombre = entrada.nextLine();
    }
   
    public void setDisco(){
   
        System.out.println("Ingrese Disco");
        Scanner entrada = new Scanner(System.in);
        disco = entrada.nextLine();
    }
   
    public String getNombre(){return nombre;}
    public String getDisco(){return disco;}
}

Código: [Seleccionar]
import java.util.Scanner;

public class testIterator
{
    public static void main (String[] args){
   
       CantanteFamoso cantante1 = new CantanteFamoso();
       CantanteFamoso cantante2 = new CantanteFamoso();
       ListaCantantes lista = new ListaCantantes("cantantes Famosos");
       lista.addCantante(cantante1);
       lista.addCantante(cantante2);
       lista.copiaValores();
       CantanteFamoso cantante3 = new CantanteFamoso();
       lista.addCantante(cantante3);
       lista.copiaValores();
       
       boolean opcion = true;
       Scanner entrada = new Scanner(System.in);
       
       do{
         
           System.out.println("Desea ingresar mas cantantes S/N");
           String valorEntrada = entrada.nextLine();
           if(valorEntrada.equalsIgnoreCase("s")){
               
                CantanteFamoso cantante = new CantanteFamoso();
                lista.addCantante(cantante);
                lista.copiaValores();

           }else if(valorEntrada.equalsIgnoreCase("n")){
                break;
            }else{
                boolean error = true;
               
                while(error == true){
               
                    System.out.println("Entrada no valida");
                    System.out.println("Desea ingresar mas cantantes S/N");
                    valorEntrada = entrada.nextLine();
                    if(valorEntrada.equalsIgnoreCase("n")){
                        error = false;
                        opcion = false;
                    }else if(valorEntrada.equalsIgnoreCase("s")){
                        error = false;
                        CantanteFamoso cantante = new CantanteFamoso();
                        lista.addCantante(cantante);
                        lista.copiaValores();
                    }//CIerre if
           
                }//Cierre while
           
            }//Cierre if
           
        }while(opcion == true);
       
       System.out.println("Fin de la ejecucion");
    }//Cierre main
}//Cierre clase

aunque la verdadera razon de comentar aqui en el foro es que tengo una duda en esta parte:
Código: [Seleccionar]
CantanteFamoso cantante = new CantanteFamoso();
en entradas anteriores explicaban que a la hora de crear objetos se crea tanto el objeto como una variable que hace referencia a la direccion de memoria donde se almacena el objeto y es atraves de esa variable que podemos acceder a los metodos de ese objeto (si no entendi mal).
Entonces mi duda es que basicamente si encerramos ese codigo en un bucle y por ejemplo se ejecuta 5 veces, se crearian 5 objetos pero 1 sola variable referenciadora por lo que solo podria acceder al ultimo objeto que se creo (o por lo menos eso es lo que noto, no se si yo este equivocado) si por ejemplo yo escribiera:
Código: [Seleccionar]
cantante.getNombre();
obtendría el valor pero del ultimo objeto y los otros 4 quedaron inaccesibles. Entonces ¿como haría para crear mediante un bucle con una sola linea de codigo tanto el objeto como su correspondiente variable sin hacer esto?:

Código: [Seleccionar]
CantanteFamoso cantante1 = new CantanteFamoso();
CantanteFamoso cantante2 = new CantanteFamoso();
CantanteFamoso cantante3 = new CantanteFamoso();
CantanteFamoso cantante4 = new CantanteFamoso();
CantanteFamoso cantante5 = new CantanteFamoso();

yo deduzco que si esos objetos se almacenan en una lista o algo asi, se podría acceder a ellos recorriendo esa lista (ya sea con el for each o con Iterator) pero si yo quisiera acceder directamente al objeto quedan inaccesibles.
« Última modificación: 09 de Enero 2016, 11:39 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola akira, para la pregunta que haces

Citar
Entonces mi duda es que basicamente si encerramos ese codigo en un bucle y por ejemplo se ejecuta 5 veces, se crearian 5 objetos pero 1 sola variable referenciadora por lo que solo podria acceder al ultimo objeto que se creó

Es como tú dices, sólo podrías acceder al último objeto y los demás quedarían inaccesibles.

Para poder acceder tendrías que ir almacenando cada objeto creado en una colección, lista o array (de modo que cada objeto tendrá un índice). Luego recorriendo los elementos de esa colección, lista o array podrás acceder a cada uno de los objetos creados.

He probado tu código y funciona, aunque quiero señalarte algunas cosas.

En la clase ListaCantantes no se entiende bien para qué tienes un método copiaValores() y otro método valoresReales(). Los nombres de estos métodos no son adecuados porque no son descriptivos de lo que hace el método. El nombre de un método debe servir para saber qué es lo que hace.

En la clase testIterator tienes una salida de bucle planteada con un break:

Código: [Seleccionar]
else if(valorEntrada.equalsIgnoreCase("n")){
                break;
            }

En general se considera no aconsejable usar un break para forzar la salida de un bucle y que es preferible que la salida del bucle se produzca de forma natural usando la propia condición del bucle.

Puedes ver este ejercicio resuelto y fijarte en cómo hacerlo: https://www.aprenderaprogramar.com/foros/index.php?topic=2889.0

Saludos

 

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".