Hola.
Les escribo para poder solucionar las dudas que tengo respecto de como implementar en Java las relaciones del diagrama de clases de UML. Hace no mucho que he empezado a ver UML y todavía me falta mucho por aprender, tanto de UML como de programación más avanzada.
Mi dilema es el siguiente.
Conceptualmente hablando tengo entendido lo siguiente:
- Una
asociación es cuando una clase usa los objetos de otra clase, pero sin poseerlos ni controlar su ciclo de vida.
- Una
agregación es igual que la asociación pero poseyendo dichos objetos. Es decir, la clase no controla el ciclo de vida de los objetos de la otra clase pero se guarda su referencia.
- Una
composición es igual que la agregación, solo que la clase si controla el ciclo de vida. Es decir, la clase se encarga de instanciar los objetos de la otra clase y obviamente guarda su referencia, todo de tal forma que cuando el objeto de la clase principal se destruye, los objetos de la otra clase también lo hacen.
Los conceptos no son difíciles de entender, si es que no me he equivocado al nombrarlos. No he nombrado la generalización porque de momento no me produce ninguna duda.
Bueno, el problema viene al intentar implementar estas relaciones en Java. He estado viendo muchas páginas en las que hablan de ello, pero solo han incrementado mi confusión debido a que en todas lo hacen de forma diferente. Con lo cual, no se que forma es realmente la correcta en términos generales.
Empezando con la asociación. ¿¿Puede que simplemente sea cuando una clase utiliza las referencias de los objetos de otra clase como argumentos en los métodos??
Código Java:
Ver originalpublic class ClasePrincipal {
public void hacerAlgo(ClaseSecundaria objeto){
//Hacer algo con el objeto de la clase secundaria...
}
}
public class ClaseSecundaria {
public void hacerAlgo(ClasePrincipal objeto){
//Hacer algo con el objeto de la clase principal...
}
}
No sé si esto es correcto y además
tampoco se como se implementaría una asociación directa, me refiero a la asociación con punta de flecha.
Respecto a la agregación. ¿¿Sería cuestión de tener un atributo del tipo de la otra clase, pero sin instanciarlo nunca, asignándole el valor mediante el constructor o un setter??
Código Java:
Ver originalpublic class ClasePrincipal {
private ClaseSecundaria objeto;
ClasePrincipal(ClaseSecundaria objeto){
this.objeto = objeto;
}
public void setObjeto(ClaseSecundaria objeto){
this.objeto = objeto;
}
public ClaseSecundaria getObjeto(){
return objeto;
}
}
public class ClaseSecundaria {
ClaseSecundaria (){
//.....
}
}
¿¿Y en la composición tendría el atributo y además me encargaría de instanciarlo directamente o en el constructor por defecto??
Código Java:
Ver originalpublic class ClasePrincipal {
private ClaseSecundaria objeto; //También se podría instanciar directamente al declararlo
ClasePrincipal(){
objeto = new ClaseSecundaria();
}
}
public class ClaseSecundaria {
ClaseSecundaria (){
//.....
}
}
Estas son mis dudas. Puede que lo que acabo de poner este todo bien, solo una parte o nada. La verdad, no tengo ni idea.
Espero con ansias vuestras respuestas.
Saludos y gracias de antemano.
PD: Perdonad si el mensaje ha sido muy largo, no se me ocurría mejor forma de reflejarlo.