Icono play
Java
Composición

El concepto de composición nos hace pensar en un todo que está conformado o compuesto por varias partes. En programación orientada a objetos (POO), un objeto de una clase en particular, puede contener dentro otros objetos de otras clases.

Para que la relación de composición sea posible es necesario que el, o los objetos contenidos, no puedan existir si no está el objeto que los contiene, en otras palabras una clase tiene a la otra

Resumiendo, la composición en Java es la capacidad que tiene una clase de contener referencias a objetos de otras clases como miembros. 

Propiedades de las relaciones de composición

Para que la composición sea posible es imprescindible que se cumplan las siguientes condiciones:

  • Únicamente una clase dentro de la relación puede representar el todo. 
  • La clase que representa al todo, es la responsable de crear a las partes y de eliminarlas, y estas solo existirán mientras el todo lo haga.
  • Una parte solo puede ser contenida por un todo, para unirse a otro todo, deberá desprenderse de su relación anterior.

Si no se cumplen esas condiciones, entonces estaríamos en una relación de agregación y no de composición. 

Para comprender mejor el concepto es necesario llevarlo a la práctica una y otra vez y ver cómo funciona. El siguiente ejemplo puede ser una guía inicial para acercarse a la composición en Java.

Ejemplos de composición en Java

En este ejemplo se va a construir una clase llamada ‘Cliente’. Esta tendrá solo 3 atributos: nombre, apellido y fecha de nacimiento. Este último atributo está compuesto por un día, un mes y un año, por lo tanto, será parte de otra clase ‘Fecha de Nacimiento’. Es decir, la clase cliente contiene a la clase fecha de nacimiento

Veamos el código de la clase ‘Cliente’:

public class Cliente {

    //creamos los atributos de esta clase 
    private String nombre;
    private String apellido;

    /*
    en este caso se trata de 
    de una referencia a un 
    objeto de otra clase que crearemos
    */
    private FechaNacimiento fecha;

    //creamos el método constructor de la clase
    public Cliente(String nombre, String apellido, FechaNacimiento fecha) {
        this.nombre = nombre;
        this.apellido = apellido;
        this.fecha = fecha;
    }

    /*
    creamos los métodos get y set
    para cada uno de los atributos, que
    nos permitirán recibir y modificar
    los datos desde fuera de esta clase
    */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getNombre() {
        return nombre;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public String getApellido() {
        return apellido;
    }

    public void setFecha(FechaNacimiento fecha) {
        this.fecha = fecha;
    }

    public FechaNacimiento getFecha() {
        return fecha;
    }

    /*
    usamos el método toString para presentar
    el contenido de los atributos de la clase
    una vez que se haya instanciado
    */
    public String toString() {
        return ("Nombre: " + this.nombre + " " + this.apellido + " " +
            "\nFecha de Nacimiento: " + this.fecha);
    }

}

Ahora veamos el código correspondiente a la clase ‘FechaNacimiento’ que está contenida dentro de la clase ‘Cliente’. Esta tiene 3 atributos que van a contener el día, el mes y el año respectivamente.

public class FechaNacimiento {

    /*
    esta clase tendrá su propios
    métodos y atributos, también 
    con el modificador private
    */
    private int dia;
    private int mes;
    private int año;

    /* 
    creamos el método constructor
    con cada una de las variables
    */
    public FechaNacimiento(int dia, int mes, int año) {
        this.dia = dia;
        this.mes = mes;
        this.año = año;
    }

    /*
    cada uno de los atributos tiene su método
    set y get para recibir y mostrar
    su contenido
    */
    public void setDia(int dia) {
        this.dia = dia;
    }

    public int getDia() {
        return dia;
    }

    public void setMes(int mes) {
        this.mes = mes;
    }

    public int getMes() {
        return mes;
    }

    public void setAño(int año) {
        this.año = año;
    }

    public int getAño() {
        return año;
    }

    /*
    Usamos el método toString() para
    poder mostrar el contenido que tienen los
    atributos una vez que se haya instanciado un objeto 
    de esta clase
    */

    public String toString() {
        return (this.dia + "/" + this.mes + "/" + this.año);
    }
}

Finalmente, la clase principal desde donde se crearán los objetos de cada una de las clases que se construyeron en los anteriores fragmentos de código. 

public class Main {

    public static void main(String[] args) {
        /*
        creamos un objeto de la clase FechaNacimiento
        que a su vez será referenciado por
        la clase Cliente y le pasamos parámetros
        */
        FechaNacimiento f = new FechaNacimiento(9, 7, 1983);

        /*
        creamos una instancia de la clase Cliente
        y le pasamos entre los parámetros la referencia al objeto
        de la clase FechaNacimiento logrando la composición
        */
        Cliente nuevoCliente = new Cliente("Pedro", "Morales", f);

        /*
        imprimimos el contenido del objeto nuevoCliente
        para ver que la composición está funcionando
        */
        System.out.println(nuevoCliente);
    }
}

Es importante resaltar que el código de este ejemplo está desglosado de manera que pueda resultar más legible y, por lo tanto, más entendible para quienes están conociendo los conceptos básicos de la programación orientada a objetos (POO) en Java.

¿Todavía no te has apuntado a nuestro Bootcamp?
Tenemos muchos cursos para ofrecerte y ¡TOTALMENTE GRATIS! Estos son algunos de ellos: