Composición de Interfaces en Java: Implementación y Beneficios
Resumen
Composición de Interfaces en Clases: abstraer todos los métodos/comportamientos de una clase para modularizarlos (comprimirlos, encapsularlos) en una interfaz y reutilizar su código en diferentes clases.
Las interfaces se crean utilizando la palabra reservada interface y se implementan en nuestras clases con implements.
Recuerda que podemos heredar (implementar) más de una interfaz, pero no podemos hacerlo de las clases padres o superclases.
En realidad las flechas están bien porque de esa manera se indica de quien esta heredando
las clases con getter and setter se conocen POJO (Plain Old Java Object)
No lo sabia
Tampoco lo sabía, buen aporte. Gracias
¿No era mejor crear una clase Appointment como super clase de AppointmentDoctor y AppointmentNurse?
También era una opción pues las clases Appointments son más lineales como menciona de la herencia, pero el objetivo era aprender interfaces :p .
Adhiero...
No he pasado este video porque de verdad antes de seguir quise practicar a fondo, hice un complejo ejercicio, una mini Api con todos los Stands y usuarios de Jojo bizarre adventure usando Implements, y de verdad que así se aprende bastante, si te pones a practicar cosas bastante jodidas y vale muchísimo la pena hacer esto, excelente clase, esta clase me había dejado las 2 neuronas faltantes fritas pero ya voy encaminado.
Pasa el link del repo de GitHub, así todos podemos aprender más viendo el código de tu implementación
Veo que eres un hombre de cultura
POJO: Plain Old Java Object
Gracias, lo entendí como Play on Java Object y no encontraba nada xd
Esto se pone cada vez más interesante y complejo! jaja
recuerden amiguitos, componer antes que heredar. Esto es porque la herencia es más estática ante el cambio, y te limita a una clase.
El uso de interfaces favorece la escalabilidad del código
"programar contra la interfaz y no contra la implementacion"
Interfaces
Definición: es un tipo de referencia similar a una clase, que tendrán solo constantes y definiciones de métodos
Se establece la forma de una clase (nombres de métodos, listas de argumentos y tipos de retornos, pero no bloques de código). Serán las clases que implementen esta interfaces las que describan la lógica del comportamiento de los métodos.
OBLIGAN a implementar métodos y atributos a las clases. Por lo tanto, fomenta el polimorfismo en los métodos.
Generalmente las interfaces indican el “PUEDE HACER” de un objeto.
Los métodos de las interfaces no llevan modificadores de acceso, al igual que las variables, ya que estos y estas los llevan implícitamente. Los métodos son public y las variables son public static final, haciéndolas constantes.
Podemos instanciar un objeto de una clase, de una interfaz no**. Se puede crear un objeto de una clase y "asignarlo" a una interfaz que implemente la clase:**
El objeto iShealudable solo tendrá acceso a los métodos que tengan en común la interfaz ISchedulable y la clase AppointmentDoctor.
Son de gran ayuda para definir los comportamientos que son redundantes y queremos reutilizar más de una clase, incluso cuando tenemos muchas clases y no todas pertenecen a la misma “familia”.
Nos da la posibilidad de tener herencia múltiple en Java.
Habrán momentos en los que los métodos van a tener comportamientos radicalmente diferentes y ya no es tan conveniente declarar el comportamiento de estos en la clase padre. Partiendo de esto, podríamos usar las interfaces, que son solo la declaración y no el comportamiento de los métodos.
Tengo una duda las clases appointmentDoctor y appointmentNurse podian derivar de un super clase Appointment y ahí incluir el método schedule para que lo herederan, ¿como seria mejor herendando de un super clase o implementando una interfaz ?
En este caso pienso que hubiera sido mejor una super clase, sin embargo la ventaja de una interfaz es que puede ser implementada por cualquier clase, es decir que no se limita a la estructura lineal de una clase padre que solo puede heredar a las clases hijas.
Para el caso se podría haber echo una superclase con los valores comunes de las clases appointmentDoctor y appointmentNurse y luego implementar la interface en appointmentDoctor y en appointmentNurse.
Hay una manera muy sencilla de ordenar arrays implementando una interfaz llamada Comparable en este caso la implementé para que ordenara un array de Doctores de mayor a menor según la cantidad de citas que tuviera.
Este es el método que tiene la interfaz Comparable por dentro y que Doctor implementa
@Overridepublic int compareTo(Object o){ int a =((Doctor) o).availableAppointments.size(); int b =this.availableAppointments.size();if(b == a){return0;}elseif(b > a){return-1;}else{return1;}}
Existe una clase muy util llamada Arrays que tiene un metodo static sort()
Ejemplo de su uso:
publicclassMain{publicstaticvoidmain(String[] args){Doctor a =newDoctor("a","@");Doctor b =newDoctor("b","@");Doctor c =newDoctor("c","@");Doctor[] arrayDoctores ={a,b,c}; a.addAvailableAppointment(newDate(),""); b.addAvailableAppointment(newDate(),""); b.addAvailableAppointment(newDate(),""); c.addAvailableAppointment(newDate(),"");for(Doctor e: arrayDoctores){System.out.println(e.getName());}//imprimirá// a ,b, c porque este fue el orden en que se agregaron Arrays.sort(arrayDoctores);//aquí usamos la clase ArraysSystem.out.println();for(Doctor e: arrayDoctores){System.out.println(e.getName());}//imprimirá//b, a, c ya que b es el que tiene mas citas "2"; a y c al ser iguales//no hace el cambio de posición }}
no entiendo, tu interfaz "Comparable" esta vinculada con tu forma de ordenar los arrays?
Arrays.sort(arrayDoctores);
@SamuelN sí, el método estático sort de la clase Arrays ordena cualquier array de objetos que implementen esta interfaz
Interesante que se esté dejando a un lado la aplicabilidad de la herencia para adoptar aún más el de interfaces.
📑 Al momento de implementar una interfaz, debemos utilizar todos sus métodos.
No entendí la verdad que diferencia o ventaja hay de hacerlo con o sin la interfaz, porque pues igual vuelvo a reescribir código :(
La interfaz te sirve para que la clase que la implementa Si o Si implementa los métodos.
Lo puedes ver como un contrato.
Son bien importantes porque en muchos sitios se recomienda usar interfaces sobre la herencia de clases. Te dejo esta lectura que amplia este concepto.
Porque cumple con un aspecto fundamental que es hacer de forma genérica: separar la especificación de una clase (qué hace) de la implementación (cómo lo hace). Esto se ha comprobado que da lugar a programas más robustos y con menos errores. Saludos :)
Porque no creamos una clase Appointment y usar herencia para crear AppointmentNurse y AppointmentDoctor?
Se puede usar una interfaz un una clase hija?
Exactamente estaba pensando lo mismo. El tener una clase appoitment hubiese "ahorrado" el código un poco el código. Puesto que podíamos sobre escribir los métodos que se requerían.
Porque se tendría que crear dos métodos por separado para poder agendar una cita, el método schunable que muestra en la clase cumple en reutilizar ese método para las dos clases. y no tener que declarar uno por clase, esto ayuda a tener buenas practicas de programación y que nuestro código sea mas sostenible. Saludos
No lo entiendo, si de todos modos definió ambos métodos y su comportamiento aparte, que hace la interfaz ahí, que desventaja trae no usarla?
Apuntes de esta Clase:
Creando una interfaz para definir si una fecha es agendable
Composición de interfaces en Clases
Es el proceso de añadirle comportamientos a una Clase mediante interfaces. Consiste en abstraer todos los métodos de una Clase y modularizarlos en una interfaz para poder reutilizarlos todas las veces que sean necesarias. Muchos desarrolladores hoy en día aconsejan usar la composición en lugar de la herencia pues en esta última la reutilización de código es lineal mientras que la composición se puede efectuar a cualquier Clase.
POJOS (Plain Old Java Object)
Es el nombre con el que se conocen las Clases con getters y setters.
Nota: una de las peculiaridades de las interfaces es que se pueden implementar múltiples Interfaces a una Clase.
Para crear una interfaz en tu IDE, asegúrate de seguir estos pasos:
Verifica la estructura del proyecto: Debes estar dentro del paquete donde deseas crear la interfaz.
Usa el menú contextual: Haz clic derecho en la carpeta del paquete, selecciona "Nuevo" y luego "Interfaz" o "Interface".
Revisa la configuración del IDE: Asegúrate de que tu IDE esté bien configurado para trabajar con Java y que no haya errores en el proyecto.
Si sigues teniendo problemas, verifica si el IDE está actualizado o si hay algún error en el proyecto.
¿Sería necesario crear una clase anidada dentro de la clase Nurse?
Me hago también la misma pregunta, revisando el código que estamos escribiendo en el curso, en la clase Doctor hace uso de una Nested Class para agregar médicos, pero para enfermero no figura por ninguna parte.
Hola
No he terminado el curso aún, pero en base a lo que he entendido, mas bien la clase anidada pasaría a ser redundante, por lo que esperaría que la misma sea removida en clases futuras.
Ya que AppointmentDoctor y AppointmentNurse pasaría a ser clases externas que se encargarán de esa necesidad del software.
Saludos