La programación orientada a objetos (POO) es una piedra angular de las aplicaciones Java robustas y mantenibles. Dos conceptos cruciales de la POO, composición y agregación, a menudo causan confusión. Ambos representan relaciones «tiene-un» entre objetos, pero difieren significativamente en sus implicaciones y uso. Este artículo aclara estas diferencias a través de ejemplos prácticos.
Tabla de contenido
- Composición en Java
- Agregación en Java
- Composición vs. Agregación
- Trabajando con Composición en Java
- Trabajando con Agregación en Java
Composición en Java
La composición, una relación «tiene-un» fuerte, significa una relación todo-parte donde el ciclo de vida de la parte depende completamente del todo. La destrucción del todo también destruye sus partes; las partes no pueden existir independientemente. Considere un automóvil: está compuesto por un motor, ruedas, puertas, etc. Desguazar el automóvil elimina estos componentes.
En Java, la composición se implementa típicamente instanciando directamente objetos parte dentro de la clase del objeto todo. El objeto todo crea y gestiona estas partes.
Agregación en Java
La agregación, una relación «tiene-un» más débil, indica que la parte puede existir independientemente del todo. El objeto todo contiene referencias a las partes, pero sus ciclos de vida no están directamente vinculados. Por ejemplo, una universidad «tiene-un» departamento, pero el departamento persiste incluso si la universidad cierra.
En Java, la agregación implica que el objeto todo contiene referencias a objetos parte. Estas referencias se pueden gestionar por separado. Las partes se pueden crear antes o después del objeto todo y sobrevivir a su destrucción.
Composición vs. Agregación
La siguiente tabla resume las diferencias clave:
Característica | Composición | Agregación |
---|---|---|
Relación | «Tiene-un» fuerte (todo-parte) | «Tiene-un» débil |
Ciclo de vida | El ciclo de vida de la parte depende del todo | El ciclo de vida de la parte es independiente del todo |
Propietario | El objeto todo posee y gestiona las partes | El objeto todo contiene referencias a las partes |
Existencia de la parte | La parte no puede existir independientemente | La parte puede existir independientemente |
Implementación | Instanciación directa dentro del objeto todo | Referencias a objetos parte independientes |
Trabajando con Composición en Java
Ilustremos la composición con un Coche
compuesto por un Motor
:
class Motor {
public void arrancar() { System.out.println("Motor arrancado"); }
}
class Coche {
private Motor motor;
public Coche() {
this.motor = new Motor();
}
public void conducir() {
motor.arrancar();
System.out.println("Coche conduciendo");
}
}
public class Main {
public static void main(String[] args) {
Coche miCoche = new Coche();
miCoche.conducir();
}
}
El objeto Motor
se crea dentro de la clase Coche
. La existencia del Motor
depende del Coche
.
Trabajando con Agregación en Java
Ahora, ilustremos la agregación con una universidad y sus departamentos:
class Departamento {
private String nombre;
public Departamento(String nombre) { this.nombre = nombre; }
public String getNombre() { return nombre; }
}
class Universidad {
private Departamento[] departamentos;
public Universidad(Departamento[] departamentos) {
this.departamentos = departamentos;
}
public void imprimirDepartamentos() {
for (Departamento dept : departamentos) {
System.out.println("Departamento: " + dept.getNombre());
}
}
}
public class Main {
public static void main(String[] args) {
Departamento cs = new Departamento("Ciencias de la Computación");
Departamento matematicas = new Departamento("Matemáticas");
Departamento[] deps = {cs, matematicas};
Universidad uni = new Universidad(deps);
uni.imprimirDepartamentos();
}
}
La Universidad
contiene referencias a objetos Departamento
. Los objetos Departamento
existen independientemente y se pueden usar en otros lugares.
Comprender la composición y la agregación permite diseñar aplicaciones Java más robustas, mantenibles y bien estructuradas. La elección depende de los requisitos de diseño y la gestión del ciclo de vida deseada de los objetos.