You are on page 1of 43

Agregación, Composición:

Implementación en Java
V7.0
Septiembre 2015
Ferreiras

Ferreiras Agregación, Composición: Implementación en Java


1
Agregación,
• Cuando una clase A contiene referencias a
una clase B, cuyas instancias existen y son
accesibles fuera de dicha clase A, decimos
que A es una agregación de B.

• Por Ejemplo:

Persona 0..1
Celular

Un objeto Persona puede tener cero o un objeto Celular.

Ferreiras
Ferreiras Agregación, Composición: Implementación en Java
2
Agregación,
• En la agregación el objeto contenido existe fuera del
objeto contenedor, es pasado a este ultimo como un
argumento en su construcción.
• El objeto contenido puede al mismo tiempo pertenecer
a otro objeto contenedor.
• Por ejemplo, la asociación Persona Carro:
• El Carro es creado en un contexto diferente y entonces se
convierte en una propiedad de un objeto Persona, pero al
mismo tiempo puede pertenecer a otro objeto persona; Por
conduce
el contrario la asociación Persona Carro
no es una agregación, es una composición. Ver más
adelante.
Ferreiras
Ferreiras Agregación, Composición: Implementación en Java
3
Agregación, Implementación
• Se construye el objeto contenido y luego es
pasado como argumento al objeto al construir
el objeto contenedor.
• Ver código agregacion0.java

Ferreiras
Ferreiras Agregación, Composición: Implementación en Java
4
Agregación,

Pedido Carro
- unMotor: Motor - unMotor: Motor
- unaRueda: Rueda[4]

4
Motor Rueda

Ferreiras Agregación, Composición: Implementación en Java


5
Agregación,
• En la agregación el objeto contenido
existe fuera del objeto contenedor, es
pasado a este ultimo como un argumento
en su construcción.
• Por ejemplo, Persona -- Carro:
El Carro es creado en un contexto
diferente y entonces se convierte
en una propiedad de Persona

Ferreiras Agregación, Composición: Implementación en Java


6
/*
Agregacion0.java

Ferreiras / Java / Relaciones entre clases / agregación

Agregación

La agregación es una relación del tipo "tiene-un(a): Un conjunto tiene-una parte

En la relación de agregación, la vida útil de la parte no es administrado por el conjunto.

Es una forma especializada de asociación donde todo objeto tiene su propio ciclo de vida
y el objeto que es parte puede que pertenece a otro conjunto.

Tomemos un ejemplo de la empresa y el empleado.

Como puede verse, la empresa no gestiona el tiempo de vida del empleado. Si se destruye la
empresa, todavía existe Empleado. Este escenario mapea bastante bien con el mundo real.

Un solo empleado puede pertenecer a múltiples compañías (El trabajo a tiempo parcial), si borramos
la Compañía, el empleado no será eliminado, seguirá vivo.

Otro ejemplo:

Supongamos que en una universidad de un solo profesor puede pertenecer a varios departamentos.
Esa es su regla de negocio. Si el departamento de CS es eliminado, no se eliminan sus profesores!

*/
Agregacion0.java

En notación UML

Empresa 1..
Empleado

Modela una agregación en la cual solo a Epresa le interesa saber de


Empleado.

A Empleado no le interesa saber de Empresa, en este modelo.

Veamos, a continuación, el código Java que implementa este modelo.


Agregacion0.java

import java.util.Vector;

class Empleado {

private String nombre;

public Empleado( String nombre) {


this.nombre = nombre;
} Es una forma de
implementar una
public String getNombre() { return nombre; } agregación en Java
}

class Empresa { Para poder enviar a


Empresa los Empleado,
private String nombre;
al momento de su
private Vector<Empleado> listaEmpleados;
creación.
public Empresa(String nombreEmpresa, Vector<Empleado> empleados) {
this.nombre = nombreEmpresa;
listaEmpleados = empleados;
}

public void verListaEmpleados() {


System.out.println("\nEn la empresa " + nombre + " Mis empleados son:\n");
for( int i = 0 ; i < listaEmpleados.size(); ++i ) {
System.out.println( listaEmpleados.get(i).getNombre() );
}
}
}
Ferreiras Agregación, Composición: Implementación en Java
9
Agregacion0.java

// Tester class

public class Agregacion0 {


public static void main( String[ ] fofi) {

// preparar lista de objetos Empleado


Vector<Empleado> listaEmpleados = new Vector<Empleado> ();
// agragamos empleados a la lista
listaEmpleados.add(new Empleado("Wilfredo Mojica") );
listaEmpleados.add(new Empleado("Raul Mateo"));
listaEmpleados.add(new Empleado("Leoncio Martinez"));
listaEmpleados.add(new Empleado("Kleto Ferrer"));
// Se crea el objeto Empresa y se le pone la lista de empleados
Empresa objEmpresa = new Empresa("4V&F, S.R.L.", listaEmpleados);
// vemos los empleados en la empresa
objEmpresa.verListaEmpleados();
// borramos el objeto empresa, objEmpresa
objEmpresa = null; // empresa eliminada
// Los objetos empleados no son eliminados
System.out.println("\nLa empresa fue eliminada, los empleados aun estan vivos !!. Ellos son:\n");
for( int i = 0 ; i < listaEmpleados.size(); ++i ) {
System.out.println( listaEmpleados.get(i).getNombre() );
}
}
}

Ferreiras Agregación, Composición: Implementación en Java


10
Agregacion0.java

/*

D:\Ferreiras2\Java, Mi Codigo>javac Agregacion0.java

D:\Ferreiras2\Java, Mi Codigo>java Agregacion0

En la empresa 4V&F, S.R.L. Mis empleados son:

Wilfredo Mojica
Raul Mateo
Leoncio Martinez
Kleto Ferrer

La empresa fue eliminada, los empleados aun estan vivos !!. Ellos son:

Wilfredo Mojica
Raul Mateo
Leoncio Martinez
Kleto Ferrer

D:\Ferreiras2\Java, Mi Codigo>

*/

Ferreiras Agregación, Composición: Implementación en Java


11
Composición
• Cuando una clase A contiene referencias a instancias
de una clase B y controla todo el acceso a dichas
instancias, decimos que A es una composición de B.
• Además, el objeto contenido no puede ser al mismo
tiempo parte de otro objeto contenedor.
• Por Ejemplo:

Persona Corazón

Un objeto Persona posee un objeto Corazón.

Ferreiras
Ferreiras Agregación, Composición: Implementación en Java
12
Composición,
Persona
- unaMano: Mano[0,2]
- unaPierga: Pierna[0,2]

0..2 0..2
Pierna Mano

Ferreiras Agregación, Composición: Implementación en Java


13
Composición
• Para implementa la composición en
Java  Se hace mediante el constructor
de la clase que se apropia, que se encarga
de construir el objeto apropiado, el cual
se almacenará en la instancia de dicha
clase contenedora.
• De ese modo, cuando sea eliminado el
objeto contenedor, se elimina el objeto
contenido.
Ferreiras Agregación, Composición: Implementación en Java
14
Composición,
• En la composición el objeto contenido
solo existe o tiene sentido dentro de otro
objeto, como parte de otro.
• Por ejemplo Persona -- Corazón;
No se crea un corazón y luego se le
pasa a una persona !!

Ferreiras Agregación, Composición: Implementación en Java


15
/*
Composicion0.java
Modela una situación real : Una
Ferreiras / Java / Agregación, Composición
persona tiene un solo Corazon y
Composición: Implementación solo a ésta le interesa saber de
Corazon

Persona Corazón
1
composición

- Es una relación del tipo "parte-de": un objeto es parte-de un todo, un conjunto.


- Es una forma especializada de agregación y podemos llamar a esto como una relación de la
"muerte".
- Es un tipo fuerte de agregación. El objeto parte no tiene su ciclo de vida y si el todo es
eliminado también son eliminados todos los objetos parte.
- Por ejemplo: La relación entre la Casa y los Cuartos. Casa puede contener varios Cuartos;
Los Cuarto no tienen vida independiente y un Cuarto no puede pertenecer a otra Casa; Si la
Casa es eliminadas,

*/

Ferreiras Agregación, Composición: Implementación en Java


16
/
Composicion0.java

class Corazon {

private String tipoCorazon;

public Corazon( String tc ) {

this.tipoCorazon = tc;
}

public String getTipoCorazon( ) { return tipoCorazon; }


}

Ferreiras Agregación, Composición: Implementación en Java


17
Cada objeto de la clase
Persona será creado con
un objeto corazón ( es lo
Composicion0.java
normal !! ) del cual es
class Persona { responsable, es
propietario.
private Corazon unCorazon;

public Persona( String tc ) {

this.unCorazon = new Corazon( tc ); // Es creado al momento de crear un objeto Persona


System.out.println("\nHe nacido con un " + tc );
}

public String verCorazon( ) {


return unCorazon.getTipoCorazon();
}

Ferreiras Agregación, Composición: Implementación en Java


18
Composicion0.java

// Tester class

public class Composicion0 {

public static void main( String [ ] fofi ) {


try, catch Es captura y
Persona p1 = new Persona( "Corazon viejo y cansado"); manejo de errores con
System.out.println("\nTengo un " + p1.verCorazon() ); excepciones, a ver en el
tema 09: Manejo de
p1 = null; // RIP la persona p1 Excepciones
try {
System.out.println("\nTengo un " + p1.verCorazon() );
}
catch( NullPointerException paolita ) {
System.out.println( "\nEl Corazon de p1 esta " + paolita.getMessage() +
", es decir, p1 esta RIP" );
}

Ferreiras Agregación, Composición: Implementación en Java


19
Composicion0.java

/*

D:\Ferreiras2\Java, Mi Codigo>javac Composicion0.java

D:\Ferreiras2\Java, Mi Codigo>java Composicion0

He nacido con un Corazon viejo y cansado

Tengo un Corazon viejo y cansado

El Corazon de p1 esta null, es decir, p1 esta RIP

D:\Ferreiras2\Java, Mi Codigo>

*/

Ferreiras Agregación, Composición: Implementación en Java


20
Composición, Agregación

• Luego, vimos que en Java, de manera


implícita, simplemente no se hace la
distinción entre la composición y la
agregación;

Ferreiras Agregación, Composición: Implementación en Java


21
Composición, Agregación

• Composición y agregación son tipos de


asociaciones.
• Están muy estrechamente relacionadas y
en términos de programación no parecen
tener mucha diferencia entre si, al menos
en Java.

Ferreiras Agregación, Composición: Implementación en Java


22
Composición, Agregación
• En Java, los objetos son referenciados
sólo por punteros.
• Esto significa que un campo de tipo A es
realmente una referencia a un objeto A.
• También significa que ese campo siempre
se iniciará como un puntero nulo, y que
explícitamente se le debe asignar a este
un new(A) .
Ferreiras Agregación, Composición: Implementación en Java
23
/*
Por ejemplo, en el código AgregComp0.java

Ferreiras / Java / Agregacion, Composicion

Implementación
1
Persona Corazón

0..1 0..1

Carro Celular

*/

Ferreiras Agregación, Composición: Implementación en Java


24
class Corazon {

private String tipoCorazon;

public Corazon( String tc ) {

this.tipoCorazon = tc;
}

public String getTipoCorazon( ) { return tipoCorazon; }


}

Ferreiras Agregación, Composición: Implementación en Java


25
class Carro {

private String marca;

public Carro( String ma ) {

this.marca = ma;
}

public String getMarcaCarro( ) { return marca; }

class Celular {

private int numero;

public Celular( int nu ) {

this.numero = nu;
}

public int getNumeroCelular( ) { return numero; }

Ferreiras Agregación, Composición: Implementación en Java


26
class Persona {

private Carro unCarro;


private Celular unCelular;
private Corazon unCorazon;

Persona( Carro ca, Celular ce, String tc ) {

this.unCarro = ca; // Agregacion


this.unCelular = ce; // Agregacion
this.unCorazon = new Corazon( tc ); // Composicion
}

public String verCorazon( ) { return unCorazon.getTipoCorazon(); }

Ferreiras Agregación, Composición: Implementación en Java


27
Estos objetos:
1) Son creados fuera del
objeto Persona; y,
2) Seguirían existiendo
sin el objeto Persona

public class AgregComp0 { La clase Persona


creará un objeto
public static void main( String [ ] fofi ) { Persona con un
objeto Corazón
Carro ca = new Carro("Toyota"); del cual es su
Celular ce = new Celular( 123456789); único propietario.

Persona unaPersona = new Persona ( ca, ce, "Atletico" );

System.out.println( "\n\nEl corazon: " + unaPersona.verCorazon() +


"\nTiene un carro marca: " + ca.getMarcaCarro() +
"\n Tiene un celular numero: " + ce.getNumeroCelular() + "\n");

}
Fíjese que para ver el corazón de Eso significa que la clase
} un objeto Persona tiene que ser vía contenedora, Persona, controla el
un método miembro de dicha clase acceso al objeto contenido,
Corazón
Ferreiras Agregación, Composición: Implementación en Java
28
/*

C:\Archivos de programa\Java\jdk1.7.0\bin>javac AgregComp0.java

C:\Archivos de programa\Java\jdk1.7.0\bin>java AgregComp0

El corazon: Atletico
Tiene un carro marca: Toyota
Tiene un celular numero: 123456789

C:\Archivos de programa\Java\jdk1.7.0\bin>

*/

Ferreiras Agregación, Composición: Implementación en Java


29
Revisitando: Asociación, Composición,
Agregación
• Agregación es un tipo especial de asociación y
composición es un tipo especial de agregación:
• A diferencia de la
asociación, la Asociación
agregación siempre
insiste en una
dirección. Agregación
• Veamos algunos
tips para luego entrar Composición
en detalles.

Ferreiras Agregación, Composición: Implementación en Java


30
Revisitando: Asociación, Composición,
Agregación

• Composición y agregación son tipos de


asociaciones.
• Están muy estrechamente relacionadas y en
términos de programación no parecen tener
mucha diferencia entre si ( la asociación con la
composición y la agregación ).

Ferreiras
Ferreiras Agregación, Composición: Implementación en Java
31
Revisitando: Asociación, Composición,
Agregación

Pedido Carro
- unMotor: Motor - unMotor: Motor
- unaRueda: Rueda[4]

4
Motor Rueda

Ferreiras
Ferreiras Agregación, Composición: Implementación en Java
32
Revisitando: Asociación, Composición,
Agregación
• Agregación es una forma especializada de asociación que
implica contención ( "consiste de“, “se compone de", "tiene
un“, ...
• En la agregación, las instancias de clases existen de forma
independiente y, por lo tanto, los ciclos de vida de los objetos
implicados no están fuertemente acoplados.
• Debido a que la agregación implica contención, por
definición, no es necesario nombrarla con las etiquetas "se
compone de" o "consiste de“, “tiene un”, como en la
asociación

Ferreiras Agregación, Composición: Implementación en Java


33
Revisitando: Asociación, Composición,
Agregación
• Por ejemplo:
• Un Carro tiene un Motor : Composición
• Un Carro tiene una Transmisión : Composición
• Un Carro tiene varias Rueda : Composición
• Una Escuela se compone de varios Profesor: Agregación

Ferreiras Agregación, Composición: Implementación en Java


34
Revisitando: Asociación, Composición,
Agregación
• En la notación UML, el símbolo del diamante se pone en el extremo de
la línea que toca la clase contenedora.
• Si es agregación, el simbolo del diamante no estara relleno:
• Si es composición, el simbolo del diamante estara relleno:
• La decisión de utilizar o no agregación en lugar de asociación es sutil,
debido a que el código de implementación es similar.
• La composición es una forma de agregación en la cual los objetos de la
clase contenida no pueden existir sin los objetos de la clase contenedora:
• Un libro esta compuesto de muchos capítulos (composición)
• Un capítulo no puede existir si el libro al cual pertenece deja de
existir

Ferreiras Agregación, Composición: Implementación en Java


35
Revisitando: Asociación, Composición,
Agregación
• Un carro tiene cuatro gomas ( composición )
Una goma no puede ser usada al mismo tiempo por otro carro
• La multiplicidad en la agregación y en la composición es reflejada como en la
asociación:

Pensum Curso
0..* 10..*

En esta agregación:
• Un Pensum debe estar compuesto de diez o más Curso
• Un Curso puede ser incluido en cero o más Pensum

Ferreiras Agregación, Composición: Implementación en Java


36
Revisitando: Asociación, Composición,
Agregación

Universidad
Rector

Facultad

• Universidad tiene un Rector


• Universidad esta compuesta de Facultad

Ferreiras Agregación, Composición: Implementación en Java


37
Revisitando: Asociación, Composición,
Agregación

• En la agregación “Universidad tiene un Rector”


Un objeto Universidad puede existir sin un Rector, esto es,
el tiempo de vida de una Universidad no esta unido al
tiempo de vida de un Rector.

• En la composición “Universidad contiene Facultad”


Un objeto Facultad no puede existir sin un objeto
Universidad, esto es, el tiempo de vida de una Facultad (o
Facultades) esta unido al tiempo de vida de la Universidad.

Ferreiras Agregación, Composición: Implementación en Java


38
Revisitando: Asociación, Composición,
Agregación
• Asociación débil ( = Agregacion )

• Un método de la clase A tiene como parámetro un objeto de la clase B:

void metodo1( B objB);

• Un método de la clase A retorna un objeto de la clase B:

B metodo2( int j );

• Una asociación débil es una agregación.

A B
+ metodo1( B objB ):void
+ metodo2( int j ): B

Ferreiras
Ferreiras Agregación, Composición: Implementación en Java
39
Revisitando: Asociación, Composición,
Agregación
• Asociación Fuerte ( = Composición )

• La clase A tiene una variable miembro que es una instancia de la clase


B y el constructor de A es quien se encarga de construir el objeto B.

private B variableMiembroA;

• Una asociación fuerte es una composición

A
- xB: B B

Ferreiras
Ferreiras Agregación, Composición: Implementación en Java
40
Revisitando: Asociación, Composición,
Agregación
• Agregación y Composición son tipos especiales de asociación.
• La Agregación es usada para representar una relación de propiedad o una relación
todo/parte;
• La composición es usada para representar una forma más fuerte de propiedad: El
tiempo de vida del todo y la parte son coincidentes; El todo tiene la responsabilidad
de disponer de sus partes en términos de su creación y destrucción.
• En la ccomposición el tiempo de vida del objeto contenido ( la parte ) depende del
objeto contenedor ( el todo ). No es así con la agregación.

Ferreiras
Ferreiras Agregación, Composición: Implementación en Java
41
Referencias
• Beginning Java Objects: From Concepts to Code; Jacquie Barker, Secon Edition;
Apress; 2005.-
• Recomendado, casi obligatorio, visitar este URL:
http://stackoverflow.com/questions/731802/what-is-the-difference-between-
composition-and-association-relationship
• http://aviadezra.blogspot.com/2009/05/uml-association-aggregation-composition.html

Ferreiras Agregación, Composición: Implementación en Java


42
Ferreiras Agregación, Composición: Implementación en Java
43