Autor Tema: Java ¿Es obligatorio tener constructor sin parámetros en todas clases? CU00667B  (Leído 6395 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas tardes.

A continuación os pongo una posible solución del ejercicio CU00667B del curso Java desde cero.

Citar
EJERCICIO

Crea una clase denominada ListaCantantesFamosos que disponga de un atributo ArrayList listaCantantesFamosos que contenga objetos de tipo CantanteFamoso. La clase debe tener un método que permita añadir objetos de tipo CantanteFamoso a la lista. Un objeto de tipo CantanteFamoso tendrá como atributos nombre (String) y discoConMasVentas (String), y los métodos para obtener y establecer los atributos. Crea una clase test con el método main que inicialice un objeto ListaCantantesFamosos y añade manualmente dos objetos de tipo CantanteFamoso a la la lista. Usando iterator muestra los nombres de cada cantante y su disco con más ventas por pantalla. Se debe pedir al usuario un nombre y disco con más ventas de otro cantante famoso, y una vez introducidos los datos mostrar la lista actualizada usando iterator. Una vez mostrada la lista actualizada, se debe dar opción a elegir entre volver a introducir los datos de otro cantante o salir del programa (se podrán introducir tantos datos de cantantes como se desee. Para ello usa un bucle while que dé opción a elegir al usuario).

Código de la clase "CantanteFamoso":

Código: [Seleccionar]
public class CantanteFamoso{
    public String nombre;
    public String discoConMasVentas;
   
    public CantanteFamoso(String valor_nombre, String valor_discoConMasVentas){
        nombre = valor_nombre;
        discoConMasVentas = valor_discoConMasVentas;
    }
   
   
    public String getNombre(){return nombre;}
   
    public String getDiscoConMasVentas(){return discoConMasVentas;}
   
    public void mostrarCantantes(){
        System.out.println("Cantante: "+nombre+"\nDisco más vendido: "+discoConMasVentas);
    }
}

Código de la clase "ListaCantantesFamosos":

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

public class ListaCantantesFamosos{
   
    private ArrayList<CantanteFamoso> listaCantantes;
   
    public ListaCantantesFamosos(){
        listaCantantes = new ArrayList<CantanteFamoso>();
    }
   
    public void añadirCantante(String valor_nombre, String valor_discoConMasVentas){
        listaCantantes.add(new CantanteFamoso(valor_nombre, valor_discoConMasVentas));
    }
   
    public int getTamaño(){return listaCantantes.size();}
   
    public CantanteFamoso obtenerInfo(int posicion){return listaCantantes.get(posicion);}
   
    public ArrayList<CantanteFamoso> obtenerLista(){
        return listaCantantes;
    }

}

Código de la clase "Test":

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

public class Test{
   
    private Scanner entradaScanner;
    private ListaCantantesFamosos listaCantantes;
   
    public static void main(String Args[]){
        ListaCantantesFamosos listaCantantes = new ListaCantantesFamosos();
        listaCantantes.añadirCantante("Michael Jackson","Thriller");
        listaCantantes.añadirCantante("Luis Miguel","Mi jardín oculto");
        Scanner entradaScanner = new Scanner(System.in);
        String entradaTeclado03;
        System.out.println("Cantantes en la lista:");
        Iterator<CantanteFamoso> iteratorCantante = listaCantantes.obtenerLista().iterator();
        while(iteratorCantante.hasNext()){
            iteratorCantante.next().mostrarCantantes();
        }
        do{ 
        System.out.print("Introduce otro cantante:");
        String entradaTeclado01;
        entradaTeclado01 = entradaScanner.nextLine();
        System.out.print("Introduce su disco de más ventas:");
        String entradaTeclado02;
        entradaTeclado02 = entradaScanner.nextLine();
        listaCantantes.añadirCantante(entradaTeclado01,entradaTeclado02);
        iteratorCantante = listaCantantes.obtenerLista().iterator();
         while(iteratorCantante.hasNext()){
            iteratorCantante.next().mostrarCantantes();
         }
       
         System.out.print("Quieres introducir más cantantes? sí/no: ");
        entradaTeclado03 = entradaScanner.nextLine();
    }while(entradaTeclado03.equals("sí"));
    if(entradaTeclado03.equals("sí")==false){
        System.out.print("Gracias por usar nuestro programa.\nHasta pronto!");
    }
  }
       
       
    }
 

PD: Para esta solución me ha servido de ayuda la resolución de barriway desde el siguiente hilo:

https://www.aprenderaprogramar.com/foros/index.php?topic=2889.0

Gracias.
« Última modificación: 07 de Marzo 2016, 08:27 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola!

Aunque no es obligatorio normalmente recomendamos tener un constructor sin atributos en todas las clases. En la clase CantanteFamoso te faltaría este constructor. También en esta clase te faltarían los métodos set (el ejercicio pide "métodos para obtener y establecer los atributos"). En general recomendamos siempre introducir métodos get y set en todas las clases.

En la clase CantanteFamoso el nombre de método mostrarCantantes no es coherente, el método no sirve para mostrar cantantes. Un nombre más adecuado sería mostrarDatosCantante o simplemente mostrarCantante pero hay que fijarse que es de un cantante, no de muchos.

En la clase ListaCantantesFamosos también te falta el método setListaCantantes. El método obtenerLista mejor llamarlo getListaCantantes, no es obligatorio, pero es un estándar que siguen todos los programadores. getTamaño ya hemos comentado que recomendamos getTamanno para evitar el uso de eñes

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Hola, César.

No entendí muy bien de lo "un constructor sin atributos". ¿Te refieres a un constructor vacío? Algo así:

Código: [Seleccionar]
public CantanteFamoso(){
    }

Es decir, el código de "CantanteFamoso" debería de quedar de la siguiente forma:

Código: [Seleccionar]
public class CantanteFamoso{
    public String nombre;
    public String discoConMasVentas;
   
    public CantanteFamoso(){
        //Nada que declarar
    }
   
    public CantanteFamoso(String valor_nombre, String valor_discoConMasVentas){
        nombre = valor_nombre;
        discoConMasVentas = valor_discoConMasVentas;
    }
   
    public void setNombre(String valor_nombre){
        nombre = valor_nombre;
    }
   
    public void setDiscoConMasVentas(String valor_discoConMasVentas){
        discoConMasVentas = valor_discoConMasVentas;
    }
   
    public String getNombre(){return nombre;}
   
    public String getDiscoConMasVentas(){return discoConMasVentas;}
   
    public void mostrarCantante(){
        System.out.println("Cantante: "+nombre+"\nDisco más vendido: "+discoConMasVentas);
    }
}

En el código de "ListaCantantesFamosos", agregué lo siguiente:

Código: [Seleccionar]
public void setListaCantantes(ArrayList<CantanteFamoso> nueva_listaCantantes){
        listaCantantes = nueva_listaCantantes;
    }

y por lo que el código se quedó:

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

public class ListaCantantesFamosos{
   
    private ArrayList<CantanteFamoso> listaCantantes;
   
    public ListaCantantesFamosos(){
        listaCantantes = new ArrayList<CantanteFamoso>();
    }
   
    public void setListaCantantes(ArrayList<CantanteFamoso> nueva_listaCantantes){
        listaCantantes = nueva_listaCantantes;
    }
   
    public void añadirCantante(String valor_nombre, String valor_discoConMasVentas){
        listaCantantes.add(new CantanteFamoso(valor_nombre, valor_discoConMasVentas));
    }
   
    public int getTamaño(){return listaCantantes.size();}
   
    public CantanteFamoso obtenerInfo(int posicion){return listaCantantes.get(posicion);}
   
    public ArrayList<CantanteFamoso> obtenerLista(){
        return listaCantantes;
    }
}

No estoy muy seguro que si corregí bien los errores. ¿Podrás volver a mirártelo?, por favor.

Gracias

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola!

Más bien me refería a un constructor tipo

    public CantanteFamoso(){
        nombre=""
   discoConMasVentas=""
    }

Con estos constructores permites crear objetos inicializados de una forma que tú has definido. Es habitual "" para cadenas, 0 para números y false para booleanos pero en ciertos casos podría ser de otra manera.

Las correcciones realizadas están ok, a seguir

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

 

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