Hola.
El código está bien y cumple lo que se pide el enunciado.
Pero hay algunas cosas que yo cambiaría.
Primero, yo no haría la petición de datos por teclado desde la clase ListaCantantesFamosos.
Esta clase debe recibir los datos, pero no necesariamente ser quien las pida.
Me refiero a que el objeto Scanner para pedir datos, lo pondría en la clase Main y que se encargue ella de pedir los datos y pasárselos a ListaCantantesFamosos.
Que si se quiere, se puede hacer que sea ListaCantantesFamosos quien pida los datos con un Scanner, pero al menos a mí, me parece más lógico que sea la clase Main quien se encargue de esa tarea.
Fíjate que luego en el Main, para preguntar al usuario si quiere repetir el bucle para seguir añadiendo nombres, usas un método perteneciente a ListaCantantesFamosos para esta entrada de datos.
ListaCantantesFamosos ha de modelar y gestionar una lista de nombres, no debería tener que encargarse de pedir el dato que decide si el bucle de otra clase distinta se va a repetir o no.
Cada clase ha de encargarse de lo "suyo". Y esto me lleva a otro cambio que haría.
El bucle for extendido, tú lo haces desde la clase Main. Y para que esta clase pueda acceder al atributo ArrayList de cantantes, no puedes poner como private dicho atributo, que en principio es lo ideal.
Sería mejor que sea la propia clase ListaCantantesFamosos quien tenga un método que se encargue de recorrer y mostrar la lista con el for extendido.
Así, no tendrá necesidad de que clases ajenas puedan acceder directamente a su atributo ArrayList.
Y por último, para optimizar más el código, en el Main yo usaría
un do while para pedir al usuario nuevos nombres y evaluar si quiere continuar.
Este bucle, como la condición de salida se evalúa al final, garantiza que al menos una vez se va a ejecutar el código que contiene.
Como el enunciado pide que solicitemos al menos un nombre al usuario, este bucle nos viene bien para pedir ese nombre obligatorio y luego ya el usuario decide si continuar o no.
Te pongo aquí el código que yo haría. Échale un vistazo para comparar los cambios.
Puede que antes previamente quieras intentar por tu cuenta hacer un nuevo código con los cambios que he comentado, pero si no te ha quedado claro lo que he intentado explicar, seguramente te será más revelador si ves mi código.
Pregunta lo que sea, un saludo.
Clase ListaCantantesFamosos
public class ListaCantantesFamosos {
private ArrayList<String> listaCantantes;
public ListaCantantesFamosos() {
listaCantantes = new ArrayList<String>();
listaCantantes.add("Jose Jose");
listaCantantes.add("Alejandra Guzman");
listaCantantes.add("Julio Iglesias");
}
public void mostrarLista() {
System.out.println("\nLista de Cantantes");
System.out.println("----- -- ---------\n");
int i = 1;
for (String cantante: listaCantantes) {
System.out.println(i + "# " + cantante);
i++;
}
}
public void addCantante(String cantante) {
listaCantantes.add(cantante);
}
}
Clase Main
public class Test {
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
ListaCantantesFamosos lista = new ListaCantantesFamosos();
String nuevoCantante = "";
String continuar = "s";
lista.mostrarLista();
do {
System.out.print("\nAñada un nuevo cantante: ");
nuevoCantante = teclado.nextLine();
lista.addCantante(nuevoCantante);
lista.mostrarLista();
System.out.print("¿Desea añadir más cantantes?(s/n): ");
continuar = teclado.nextLine();
}while(continuar.equals("s"));
teclado.close();
System.out.println("\n\t\tFIN DE PROGRAMA");
}
}