Hola.
A ver, algunas correcciones en la clase
Artista.
- No se necesita importar la clase Scanner, porque no se van a pedir datos desde esta clase.
- Hay una llave de cierre equivocada que provoca que la clase se cierre donde no debe, dejando FUERA de ella los métodos que vienen a continuación.
- El método setDNI(), recibe entre paréntesis un argumento llamado "DNI", todo en mayúscula. Pero luego dentro de su cuerpo se usa la palabra "dni", en minúscula.
Por tanto Java considera que no se está haciendo nada con el argumento DNI, porque no se le está nombrando en el código.
Hay que escribirlo exactamente igual, de lo contrario, se consideran variables distintas.
import java.util.Scanner; //Este import es innecesario
public class Artista {
private String dni;
private String nombre;
public Artista(String dni, String nombre) {
this.dni = dni;
this.nombre = nombre;
}
} //Esta llave está CERRANDO la clase antes de tiempo.
public String getdni() {
return dni;
}
public void setDNI(String DNI) {
this.dni = dni; //El argumento DNI es en mayúsucula, no es en minúscula
}
public String getnombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
Una vez corregido, debería quedar así:
public class Artista {
private String dni;
private String nombre;
public Artista(String dni, String nombre) {
this.dni = dni;
this.nombre = nombre;
}
public String getdni() {
return dni;
}
public void setDNI(String DNI) {
this.dni = DNI;
}
public String getnombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
Sobre la clase
Exposicion.
Hablemos de sus atributos.
Para la hora de inicio y fin, has elegido el tipo double.
Existen clase para trabajar con horas, tiempos y fechas.... pero ahora mismo es mejor no usarlas para no complicar más la cosa.
Así que el tipo double puede servir perfectamente, aunque yo incluso optaría por usar el tipo int y así trabajamos con enteros para las horas.
Esta exposición empieza a las 16 y termina a las 18, esta otra empieza a las 7 y acaba a las 10, etc...
Para el artista, he visto que has puesto un ArrayList. Esto podría estar bien si vamos a considerar que una exposición, puede tener muchos artistas.
Pero leyendo el enunciado, parece que lo que vamos a considerar es que una exposición, tiene solo un único artista.
Así que yo optaría por esto último, además simplifica las cosas.
Además, en el constructor de
Exposicion ya has puesto que se recibe un
Artista de forma externa, aunque luego no haces nada con él.
Aquí tenemos dos opciones:
- el Artista se recibe por constructor, y por tanto, esta clase no es necesario que pida datos para crear un artista.
- el constructor
NO recibe ningún Artista, y por tanto, esta clase ha de tener un método para pedir datos mediante Scanner y así construir el artista.
Ambas posibilidades son válidas. Yo, personalmente, prefiero la primera. Porque me gusta más que haya una sola clase encargada de pedir datos, ya sea la clase prinicipal o una clase "gestora" que se encargue expecíficamente de esto.
El resto de clases prefiero que tan solo reciban datos, los guarden, operen con ellos... pero que no tengan que pedirlos.
Si lo hacemos así, ya no necesitamos tampoco importar la clase Scanner, ni tampoco la clase ArrayList porque solo vamos a tener un artista por exposición.
Yo, por ahora, dejaría así la clase
Exposicionpublic class Exposicion {
private int inicio;
private int fin;
private Artista artista; //Una exposicion, solo tiene un artista
public Exposicion(int inicio, int fin, Artista artista) {
this.inicio = inicio;
this.fin = fin;
this.artista = artista;
}
public int getInicio() {
return inicio;
}
public void setInicio(int inicio) {
this.inicio = inicio;
}
public int getFin() {
return fin;
}
public void setFin(int fin) {
this.fin = fin;
}
public Artista getArtista() {
return artista;
}
public void setArtista(Artista artista) {
this.artista = artista;
}
}
Aunque insisto en que se podría usar double en lugar de int, y que también se podría hacer que esta clase pidiera datos para crear el
Artista. Esto ya es a gusto del programador.
Sobre la clase
Galeria (ojo que has escrito mal el nombre).
Una galeria puede tener muchas exposiciones.
Así que en este caso, sí nos vendrá bien usar un ArrayList de exposiciones.
Has añadido dos atributos: código y capacidad.
No los pide el enunciado, pero bueno, son atributos que tienen sentido para una galería, así que podemos usarlos.
Veo que has puesto un método para pedir datos y crear exposiciones. Como ya he dicho, se puede hacer así si lo deseas.
Pero entonces no tiene sentido que el método para crear exposiciones, reciba como argumento una exposición. No la está usando para nada, porque va a crear su propio objeto
Exposicion.
Otro fallo en este método es que para crear la Exposicion, llamas a un constructor que solo recibe hora de inicio y fin. Pero el constructor de Exposicion exige recibir también un Artista.
public void AgregarExposicionDatos(Exposicion expo){ //NO ha de recibir nada por paréntesis
Scanner in = new Scanner(System.in);
System.out.print("Ingrese la hora de inicio");
double inicio = in.nextDouble();
System.out.print("Ingrese la hora del final");
double fin = in.nextDouble();
this.LExposicion.add(new Exposicion (inicio,fin)); //Constructor de exposicion erróneo, falta Artista
System.out.print("Exposicion creada ...");
}
Así que tendrías que cambiar el constructor de
Exposicion para que no pida recibir un
Artista, o bien, añadirle un segundo constructor donde solo pida las horas de inicio y fin.
Así se podrá crear una
Exposición de las dos formas, pero recuerda que luego habrá que pedir los datos del
Artista.
Yo, igual que antes, voy a preferir que esta clase no pida datos, tan solo que los reciba.
Pero
atención, tanto si recibe
Exposiciones ya creadas, como si se encarga ella de crearlas pidiendo datos con Scanner...., antes de añadirlas al ArrayList, se ha de comprobar que sus horas de inicio y fin no se solapan con las de otra
Exposicion.
Si existe una
Exposicion que empieza a las 16 y acaba a las 18..., no voy a poder añadir otra
Exposicion que comience a las 17..., porque de 16 a 18 ya hay otra
Exposicion ocupando la
Galeria.
Hemos de añadir código para decidir si aceptamos o rechazamos una
Exposicion, según su hora de inicio y fin.
Por desgracia se me acaba el tiempo y ahora no puedo seguir con esto.
Luego cuando pueda intentaré seguir avanzando. Ves pensando en una forma de comprobar el tema de las horas de las exposiciones, que no coincidan unas con otras.
De momento, la clase
Galeria la tengo así:
import java.util.ArrayList;
public class Galeria {
private int codigo;
private int capacidad;
private ArrayList<Exposicion> LExposicion;
public Galeria(int codigo, int capacidad) {
this.codigo = codigo;
this.capacidad = capacidad;
this.LExposicion = new ArrayList<Exposicion>();
}
public void agregarExposicion(Exposicion expo) {
/*
* Antes de aceptar la exposicion,
* hay que comprobar si sus horas de inicio/fin
* se solapan o no con otras exposiciones ya
* registradas
*/
}
public void ImprimirListaExposicion(){
System.out.println("Lista de exposiciones ");
for ( Exposicion Expo : this.LExposicion){
System.out.println("Inicio: " + Expo.getInicio() + "Fin: "+ Expo.getFin());
}
}
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public int getCapacidad() {
return capacidad;
}
public void setCapacidad(int capacidad) {
this.capacidad = capacidad;
}
}