Hola lpeiro61 , en el constructor de la clase ListaCantentesFamosos encuentro algunas cosas a comentar:
public ListaCantantesFamosos(String nombre)
{
nombreLista = nombre;
listaCantantes = new ArrayList<String>();
getNombreLista();
listaCantantes.add("Rosendo");
listaCantantes.add("Bon Jovi");
listaCantantes.add("Loquillo");
listarLosCantantes();
}
El constructor es el lugar donde se inicializan (se establece el estado inicial) de los objetos.
Normalmente tendremos un constructor sin parámetros y otro con todos los parámetros. Tú has planteado un constructor que recibe sólo un parámetro cuando la clase tiene dos atributos. Está bien, puede hacerse, pero ten en cuenta que no será normalmente lo más habitual.
La línea getNombreLista(); dentro del constructor ¿hace algo? En principio te diré que no hace nada, es decir, que puedes eliminarla porque no tiene ningún efecto. getNombreLista() sirve para recuperar el nombre de la lista, pero aquí no veo que haga nada.
En el constructor añades tres cantantes como pedía el enunciado del ejercicio.
Y luego invocas el método listarLosCantantes();
Esto implica que cuando creas un objeto, se invoca el método, y ese método lo que hace es mostrar por consola la lista de cantantes. ¿Forma esto parte de la inicialización de un objeto? No ¿Debe ir esto en el constructor? No, porque el constructor está destinado a inicializar los objetos, no a mostrar mensajes por consola. Esta idea es extensible a métodos: cada método tiene una responsabilidad, no debe hacer otras cosas. Por ejemplo un método get debe devolver algo, no hacer otras cosas.
Fíjate por ejemplo en este método que has escrito:
public void addCantante(String cantante)
{
listaCantantes.add(cantante);
System.out.println("");
}
¿Para qué sirve el método addCantante? Para añadir un cantante a la lista. No debe servir para nada más. Por tanto no debe incluir System.out.println("");, no es su responsabilidad. Esto se llama principio de cohesión: cada método tiene una responsabilidad.
Habrás visto en otros ejercicios en los foros que se llama el método para listar cantantes dentro del constructor o métodos que hacen varias cosas, etc. Quizás yo mismo haya pasado esto por alto en alguna ocasión, pero bueno, para eso hay distintas personas que revisamos ejercicios y no siempre nos damos cuenta o comentamos absolutamente todo...
Otro método:
public void getNombreLista()
{
System.out.print(nombreLista + "\n");
}
Un método get normalmente se usa para devolver algo. Por ejemplo return nombre;
Si lo que quieres es mostrar algo por pantalla es preferible que llames al método mostrarNombreEnConsola ó simplemente mostrarNombre.
Para tu bucle for extendido: lee los comentarios sobre el uso de i++ en
https://www.aprenderaprogramar.com/foros/index.php?topic=2784.0En tu método main: esta línea no tiene ninguna utilidad: lista.getNombreLista();
Aparece en un par de sitios. Ten en cuenta que esas invocaciones normalmente se hacen cuando queremos recuperar algo para hacer algo.
Por ejemplo System.out.println ("El nombre de la lista es "+ lista.getNombreLista());
Aquí estamos recuperando el nombre de la lista para hacer algo con él. Hacer simplemente lista.getNombreLista(); no tiene ningún efecto, lo estamos recuperando pero ¿para qué si no hacemos nada con él?
Esta línea: if(!seguir.equalsIgnoreCase("s")){break;}
Lee los comentarios al respecto en
https://www.aprenderaprogramar.com/foros/index.php?topic=4096.0Creo que eso es todo, no sé si me habrá quedado algún detalle atrás.
Te parecerá que son muchas correcciones y quizás pienses que tu código estaba mal. No, el código no estaba mal, de hecho funcionaba correctamente, y de hecho tiene bastantes cosas buenas. Muchas veces se presentan en el foro soluciones bastante peores.
Pero si quieres mejorar, te recomiendo que leas los comentarios anteriores con calma y dediques un tiempo a cada una de las cosas, que hagas pruebas, y luego que rehagas el ejercicio.
Me he extendido un poco, espero que te sirva de ayuda
Saludos