Café y Código

12. Composición, Agregación y Colecciones de Objetos

1. Relación "Tiene-Un": Objeto dentro de otro Objeto

En la Composición y Agregación, un objeto incluye a otro objeto como uno de sus atributos. Por ejemplo, una entidad Usuario tiene como atributo una mascota Perrito.

Relación 1 a 1: Usuario y Perrito
JAVA
1// 1. Clase Perrito
2public class Perrito {
3 private String nombre;
4 private String raza;
5 private int edad;
6
7 public Perrito(String nombre, String raza, int edad) {
8 this.nombre = nombre;
9 this.raza = raza;
10 this.edad = edad;
11 }
12
13 public void ladrar() {
14 System.out.println("🐶 " + nombre + " (" + raza + ") dice: ¡Guau guau!");
15 }
16
17 @Override
18 public String toString() {
19 return "Perrito { nombre='" + nombre + "', raza='" + raza + "', edad=" + edad + " }";
20 }
21}
22
23// 2. Clase Usuario con un Perrito como atributo (1 a 1)
24public class Usuario {
25 private String nombre;
26 private Perrito mascota; // Atributo de tipo objeto Perrito
27
28 public Usuario(String nombre) {
29 this.nombre = nombre;
30 }
31
32 public void setMascota(Perrito mascota) {
33 this.mascota = mascota;
34 }
35
36 public Perrito getMascota() {
37 return this.mascota;
38 }
39
40 public void mostrarPerfil() {
41 System.out.println("Usuario: " + nombre);
42 if (mascota != null) {
43 System.out.println("Mascota asignada: " + mascota.toString());
44 mascota.ladrar();
45 } else {
46 System.out.println("Aún no tiene mascota asignada.");
47 }
48 }
49}

2. Relación 1 a Muchos: Usuario con Arreglo de Objetos (Perrito[])

Si un Usuario puede tener varios perritos, declaramos un arreglo de tipo Perrito[] como atributo dentro de la clase:

UsuarioConJuria.java (Arreglo de Objetos Perrito[])
JAVA
1public class UsuarioConJuria {
2 private String nombre;
3 private Perrito[] mascotas; // Arreglo de objetos Perrito
4 private int contadorMascotas;
5
6 public UsuarioConJuria(String nombre, int capacidadMax) {
7 this.nombre = nombre;
8 this.mascotas = new Perrito[capacidadMax];
9 this.contadorMascotas = 0;
10 }
11
12 // Agregar un perrito al arreglo
13 public void agregarMascota(Perrito p) {
14 if (contadorMascotas < mascotas.length) {
15 mascotas[contadorMascotas] = p;
16 contadorMascotas++;
17 System.out.println("✅ " + p.toString() + " agregado a la lista de " + nombre);
18 } else {
19 System.out.println("⚠️ Capacidad máxima alcanzada.");
20 }
21 }
22
23 // Hacer ladrar a todas las mascotas con un bucle for-each
24 public void pasearMascotas() {
25 System.out.println("--- PASEO DE MASCOTAS DE " + nombre.toUpperCase() + " ---");
26 for (int i = 0; i < contadorMascotas; i++) {
27 Perrito p = mascotas[i];
28 p.ladrar();
29 }
30 }
31}

3. Relación Dinámica con ArrayList<Perrito>

Para manejar una cantidad ilimitada y dinámica de objetos, utilizamos la colección ArrayList<Perrito>:

MainComposicion.java (ArrayList de Objetos)
JAVA
1import java.util.ArrayList;
2
3public class UsuarioDinamico {
4 private String nombre;
5 private ArrayList<Perrito> listaMascotas;
6
7 public UsuarioDinamico(String nombre) {
8 this.nombre = nombre;
9 this.listaMascotas = new ArrayList<>();
10 }
11
12 public void adoptarPerrito(Perrito p) {
13 listaMascotas.add(p);
14 }
15
16 public void listarTodos() {
17 System.out.println("Mascotas adoptadas por " + nombre + ":");
18 for (Perrito p : listaMascotas) {
19 System.out.println("- " + p);
20 p.ladrar();
21 }
22 }
23}
24
25// Ejemplo de Ejecución en Main:
26public class MainComposicion {
27 public static void main(String[] args) {
28 Perrito p1 = new Perrito("Max", "Golden Retriever", 3);
29 Perrito p2 = new Perrito("Rocky", "Bulldog", 2);
30 Perrito p3 = new Perrito("Toby", "Poodle", 1);
31
32 UsuarioDinamico usuario = new UsuarioDinamico("Carlos");
33 usuario.adoptarPerrito(p1);
34 usuario.adoptarPerrito(p2);
35 usuario.adoptarPerrito(p3);
36
37 usuario.listarTodos();
38 }
39}

Ponte a prueba

Comprueba tus conocimientos sobre objetos contenidos dentro de otros objetos y arreglos de instancias.

Dato curioso: JDK 1.0 en 1996; James Gosling y Sun Microsystems. Wikipedia

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.