
Ignacio Saccomano
Preguntano entiendo como influye el static en la clase available appointment. Si alguien me lo explica mejor le agradezco (especialmente su uso en el foreach). no entiendo cual seria la diferencia con que no sea static

NIXON RAUL GAMBOA GARCIA
Eso quiere decir que todas las instancias de la clase Doctor van a compartir la misma coleccion de AvailableAppointment?

Ignacio Saccomano
Gracias por el ejemplo!

Ismael Alonso Vázquez
Este es un código que hice similar al de la clase:
package mx.ismaelalonso.example import java.util.Date; public class TestDoctor { public static void main(String[] args) { Doctor myDoctor = new Doctor("Paty"); myDoctor.addAppointment(new Date(), "4 pm"); myDoctor.addAppointment(new Date(), "10 pm"); for (Doctor.AvailableAppointment appointment : myDoctor.getAppointments()) { System.out.println(appointment); } } }
Este código no se ve afectado por como este definida la clase anidada AvailableAppointment, si es estática o no. Esto es debido al encapsulamiento de la clase AvailableAppointment dentro de la clase Doctor.
Se podría decir que la clave esta en que la forma de declarar que un objeto es de tipo AvailableAppointment es la misma aunque la clase anidada sea estática o no:
Doctor.AvailableAppointment appointment;
Por último, también es importante destacar que la clase AvailableAppointment tiene el modificador de acceso public por lo que esta clase puede ser utilizada fuera de la clase Doctor y en otros package.

Ignacio Saccomano
Ah, ahora entendí bien. Muchas gracias por la explicación detallada. Lo que sí noté que cuando no especificaba que la clase anidada era estática el código funcionaba perfectamente de todos modos. ¿Por qué será?

Ismael Alonso Vázquez
Hola @nachosaccomano
La palabra reservada static influye en la clase AvailableAppointment al hacerla un miembro estático de la clase Doctor.
Al ser un miembro estático significa que la clase AvailableAppointment a pertenece a la clase Doctor. Se accede a la clase AvailableAppointment a través de la clase Doctor.
Por ejemplo, si quisiéramos crear objetos de tipo AvailableAppointment fuera de la clase Doctor, lo haríamos de la siguiente forma:
Doctor.AvailableAppointment appointment = new Doctor.AvailableAppointment(new Date(), "4 pm");
Observa como al crear un objeto de tipo AvailableAppointment, se debe indicar que proviene de la clase Doctor.
Si en la definición de la clase anidada AvailableAppointment no indicáramos que sea una clase estática, es decir, si quitamos la palabra static; ya no sería un miembro estático de la clase Doctor.
public class Doctor { /* other fields and methods of Doctor class*/ public class AvailableAppointment { /* fields and methods of AvailableAppointment class */ } }
entonces la sintaxis para crear un objeto de este tipo fuera de la clase Doctor sería:
1 Doctor myDoctor = new Doctor("Paty"); 2 Doctor.AvailableAppointment appointment = myDoctor.new AvailableAppointment(new Date(), "4 pm");
En la línea 1 del código anterior, se muestra como para este caso sería necesario crear un objeto de tipo Doctor antes de crear objetos de tipo AvailableAppointment. Esto se debe a que AvailableAppointment sería un miembro no-estático de la clase Doctor y se requiere crear ahora un objeto de tipo Doctor. Ahora a través del objeto myDoctor se podrían crear objetos de tipo AvailableAppointment.
Si nos trasladamos al contexto de los campos y métodos definidos en una clase como el campo name de la clase Doctor, sabemos que no podemos asignar un valor a name sin antes crear un objeto Doctor. Esto es porque el campo name es una variable de instancia por lo que esta variable pertenece a las instancias (objetos) que se construyan. Si AvailableAppointment es una clase interna de Doctor (y no es estática), entonces los objetos AvailableAppointment pertenecen a objetos de tipo Doctor y no a la clase Doctor en sí.
En este contexto de que AvailableAppointment sea una clase interna dentro de la clase Doctor y que NO sea una clase estática anidada, hace necesario la creación de un objeto Doctor para crear objetos AvailableAppointment fuera de la definición de la clase Doctor.

Ignacio Saccomano
Entendí el foreach, pero no por qué se usa static en la clase anidada ya que depende por definición de la clase 'Doctor' (en este caso). ¿Alguien sabe?

Ignacio Saccomano
Básicamente me partió la cabeza el foreach.