No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Java SE Orientado a Objetos

Curso de Java SE Orientado a Objetos

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Creando una interfaz para definir si una fecha es agendable

24/38
Recursos

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.

public interface ISchedulabe {
  void schedule(Date date, String Time);
}

public class AppointmentDoctor implements ISchedulable {
  @Override
  public void schedule(Date date, String Time) {
    // ...
  }
}

Aportes 62

Preguntas 19

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Mas o menos así se vería un poco mas organizado

las clases con getter and setter se conocen POJO (Plain Old Java Object)

¿No era mejor crear una clase Appointment como super clase de AppointmentDoctor y AppointmentNurse?

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.

POJO: Plain Old Java Object




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.

  • Sintaxis:

    public interface ISchedulable {
    	schedule(Date date, String Time);
    }
    
    public class AppointmentDoctor implements ISchedulable {
    
    }
    
  • 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:**

    public static void main(String[] args) {
    	ISchedulable iShealudable = new AppointmentDoctor();
    }
    
    • 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 ?

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

 @Override
    public int compareTo(Object o) {
        int a =  ((Doctor) o).availableAppointments.size();
        int b = this.availableAppointments.size();
      
        if(b == a){
            return 0;
        }else if(b > a){
            return -1;
        }else {
            return 1;
        }
    }

Existe una clase muy util llamada Arrays que tiene un metodo static sort()
Ejemplo de su uso:

public class Main {
    public static void main(String[] args) {

        Doctor a = new Doctor("a","@");
        Doctor b = new Doctor("b","@");
        Doctor c = new Doctor("c","@");

        Doctor[] arrayDoctores = {a,b,c};

        a.addAvailableAppointment(new Date(),"");

        b.addAvailableAppointment(new Date(),"");
        b.addAvailableAppointment(new Date(),"");

        c.addAvailableAppointment(new Date(),"");

        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 Arrays
        System.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 
    }
}

Interesante que se esté dejando a un lado la aplicabilidad de la herencia para adoptar aún más el de interfaces.

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?

📑 Al momento de implementar una interfaz, debemos utilizar todos sus métodos.

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.

public class AppointmentNurse implements ISchedulable, Runable {
	...
}

COMPARTO CÓDIGO DE LAS CLASES CREADAS EN LA SESIÓN: 😊

Clase Nurse:

public class Nurse extends User{
    private String speciallity;
    public Nurse (String name, String email){
        super(name,email);
    }

    public String getSpeciallity() {
        return speciallity;
    }

    public void setSpeciallity(String speciallity) {
        this.speciallity = speciallity;
    }
}

Clase AppointmentDoctor:

package model;

import java.util.Date;

public class AppointmentDoctor implements ISchedulabel{
    private int id;
    private Patient patient;
    private Doctor doctor;
    private Date date;
    private String time;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Patient getPatient() {
        return patient;
    }

    public void setPatient(Patient patient) {
        this.patient = patient;
    }

    public Doctor getDoctor() {
        return doctor;
    }

    public void setDoctor(Doctor doctor) {
        this.doctor = doctor;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    @Override
    public void schedule(Date date, String time) {

    }
}

Clase AppointmentNurse:

package model;

import java.util.Date;

public class AppointmentNurse implements ISchedulabel{
    private int id;
    private Patient patient;
    private Nurse nurse;
    private Date date;
    private String time;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Patient getPatient() {
        return patient;
    }

    public void setPatient(Patient patient) {
        this.patient = patient;
    }

    public Nurse getNurse() {
        return nurse;
    }

    public void setNurse(Nurse nurse) {
        this.nurse = nurse;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    @Override
    public void schedule(Date date, String time) {

    }
}

Interface IShedulabel:

package model;

import java.util.Date;

public interface ISchedulabel {
    void schedule(Date date, String time);
}

Creando una interfaz para definir si una fecha es agendable

El concepto de añadirle comportamientos a una clase se llama composición, composición de interfaces en clases. Lo que se hace es abstraer los métodos de una clase y comprimirlas en una interfaz para después reutilizarla en todas las clases que tengan esos comportamientos.


Las clases en las que están los getters y setters son conocidas como POJO’s (Plain Old Java Object).

Los métodos que pongamos en una interfaz tienen que ser implementados forzosamente en las clases que implementen la interfaz.
Una interfaz es como un contrato, donde tienes que cumplir con implementar todos los métodos de esta para que no existan errores.

algo que me deja con mas preguntas que respuestas es la implementación de las interfaces a nuestro codigo directamente pero pa hoy hoy yo ya comprendí directamente que son las interfaces ya la profe nos hablo sobre ellas pero son mas osea la interfaces no son únicamente puentes que establecen contractos sino por lo leído y comprendido estas son bases fundamentales para poder crear api.pero se que hay mas y me surgen dudas en el maquetado de la profesora digamos que nosotros desarrollamos de tal forma donde ponemos nuestros constructores y sus parte para poder. Yo intuyo que podemos o creamos de esta forma para poder.conectar con una base de dato yo me he tomado. el atrevimiento de hacerlo y metido programacion estructura hasta ahora les comparto mi codigo eh usado clases anidadas y muchos de los conceptos dados hasta ahora
Hice un diagrama con unas cuantos detalles: Azul: Clase Amarillo: Enum Morado: Interfaz Lo hice con <https://drawio.com> ![](https://static.platzi.com/media/user_upload/Diagrama%20sin%20t%C3%ADtulo-45fb68b9-3790-4d32-86ed-1bcce075f26a.jpg)
Según lo que investigué: ¿Que es un POJO? *<u>Plain Old Java Object</u>*. Es un tipo de clase que se caracteriza por lo que NO hace con tres aspectos. 1.-NO extiende de ninguna otra clase. ```java public class Gato extends Animal { int edad; String nombre; } ``` 2.-NO implementa ninguna interfaz. ```java public class Gato implements HaceRuido { int edad; String nombre; } ``` 3.-NO tiene anotaciones externas. ```java @Entity public class Gato { int edad; String nombre; } ``` Entonces un POJO se vería así: ```js public class Gato { int edad; String name; } ``` Se suele confundir un ***POJO*** con un ***JavaBean***(Para recordarlo, imagina un granito de café :D). Pero el ***JavaBean*** tiene unos requerimientos adicionales: 1.- Un constructor público sin argumentos. 2.- Todas su propiedades (variables de instancia) tienen que ser privadas. 3.- Getters y Setters públicos. 4.- Tiene que ser serializable. ```java // Es serializable (tema para otro curso) public class Gato implements Serializable{ //Todas sus propiedades son privadas private int edad; String nombre; //No tiene constructor sin argumentos /* Ejemplo: public Cat() { } o usando -> Cat miGato = new Cat(); */ //Getters y Setters públicos public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } } ``` Según lo que investigué lo que dijo Anahí de que tiene que tener *<u>getters</u>* y*<u> setters</u>* para ser un ***POJO*** no es así, eso es lo que necesita para ser un ***JavaBean***.
![](https://static.platzi.com/media/user_upload/image-d3337651-a9ec-4442-8c81-eef38f940050.jpg)![](https://static.platzi.com/media/user_upload/image-b654d461-a474-4ded-8865-8f8ae3d61d9b.jpg)

Esto me recuerda a los React hooks de React, y específicamente el react context, es similar el concepto.

Además de los comentarios de los compañeros sobre una clase padre de Appointment, debería crearse una clase padre de Nurse y Doctor, ya que se está repitiento mucha cantidad de código. Por ejemplo, yo he creado la clase UserSpecialist, pensando en que se pueden crear más clases de usuarios especialistas, de modo que las clases Nurse y Doctor heredan de UserSpecialist, generando un código mucho más limpio y sin redundancia.

Al mover los archivos a la carpeta model, hay que agregar “package model;” para evitar errores

Utilizamos interfaces cuando detectamos comportamientos que se pueden reutilizar en diferentes familias, en diferentes clases. La ventaja de las interfaces es que no importa en que familia o nivel de herencia se encuentre, podemos reutilizar su comportamiento e implementar a cualquier clase.

Esta aplicando MVC? hay algun curso de eso?

Composición = dar poderes a las clases,
abstraer métodos acciones de una clase, comprimirlos o encapsularlos en una interfaz para posteriormente utilizarlo.

Super!!

Genial!

Excelente explicación de las interfaces como se implementan

genial 😃

Hola comparto mi repo con todos los ejercicios hasta el momento.
😉

https://es.m.wikipedia.org/wiki/Composici%C3%B3n_de_objetos

gracias 😃

Increíble. Gracias.

En una interfaz se define el método y sus parámetros y las clases lo implementan, podríamos decir que se define “qué” hacer, pero no el
"cómo" hacerlo, la ventaja sobre la herencia es que se pueden implementar tantas interfaces como necesitemos y cualquier nivel, haciendo el código más modular.

Lo gracioso es que ya había tenido un acercamiento y trabajado con interfaces, pero no entendía bien su funcionalidad, ahora veo… Que ese proyecto es un pequeño Frankenstein jajajajaj y que su arquitectura es pésima… Gracias Anahi. eres la mejor!!! Ahora entiendo cada vez mas a Java y como funciona y cuando y porque usar las cosas.

Un POJO es una clase modelo de un objeto de la vida real abstraído a código, que tiene atributos y comportamientos

Muchas gracias por la estupenda clase instructora Anahí, ahora tengo más claro cómo utilizar las interfaces y ciertos detalles como al momento de mover las clases a paquetes va ser necesario establecerlas public para que en otros lugares sean visibles.

Genial.

Excelente clase 😁

Excelente clase, desconocía totalmente las interfaces.

POJO son las iniciales de “Plain Old Java Object”, que puede interpretarse como “Un objeto Java Plano Antiguo”. Un POJO es una instancia de una clase que no extiende ni implementa nada en especial. Para los programadores Java sirve para enfatizar el uso de clases simples y que no dependen de un framework en especial. Este concepto surge en oposición al modelo planteado por los estándares EJB anteriores al 3.0, en los que los Enterprise JavaBeans (EJB) debían implementar interfaces especiales.

Favorece la composición antes que la herencia. Es un principio del Diseño.

La composición es la utilización de objetos dentro de otros objetos, se conoce como la relacion tiene un en lugar de es un como lo aplica la herencia.


gracias por el aporte

Los POJOS son objetos antiguos de java y el objetivo de estos es desacoplar cualquier framework de la lógica de negocio.

Una forma de optimizarlo aún más, a mi parecer, sería que tanto Doctor como Enfermera sean subclases de una clase llamada trabajador/empleado, (podría ser una clase abstracta, pero entiendo que aún no se ha dado)

Lo mismo para las clases de citas, porque así me parece que se repite bastante el código. Aunque claro, entiendo que esto es un ejemplo

geniaaal

Yo cambié la lógica para que sean los Doctores o Enfermeras las que implementen una interfaz para que atiendan, así que la Appointment solo requiere un objeto con una implementación ISchedulable

Se que a lo mejor a muchos les parece que la estética y el orden no importan, pero es que el diagrama de Anahí es un caos

En java SE 1.8 existe el API joda-time para manejar fechas y horas…!

No seria mejor hacer una clase Appointment que herede a la de AppointmentDoctor y AppointmentNurse y solo cambiar el objeto Doctor y el objeto Nurse?

Luego de ver el tema de composicion me puse a investigar y parecer ser la mejor opcion sobre POO ya que tu codigo puede ser mas escalable.

Wow, por fin entendí las interfaces