Cuando programamos en Java en muchas ocasiones nos encontramos con la necesidad de usar el concepto de delegación . Este conceptos es muy habitual cuando tenemos estructuras de clase de composición. Es decir un objeto A contiene un Objeto B. Por ejemplo supongamos que tenemos el diagrama de clases de Coche y Motor.

Vamos a ver su código Java :
package com.arquitecturajava;
public class Coche {
private String marca;
private Motor motor;
public Motor getMotor() {
return motor;
}
public void setMotor(Motor motor) {
this.motor = motor;
}
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
package com.arquitecturajava;
public class Motor {
private int potencia;
private int cilindros;
public int getPotencia() {
return potencia;
}
public void setPotencia(int potencia) {
this.potencia = potencia;
}
public int getCilindros() {
return cilindros;
}
public void setCilindros(int cilindros) {
this.cilindros = cilindros;
}
}
package com.arquitecturajava;
public class Principal {
public static void main(String[] args) {
Coche c = new Coche();
c.setMarca("Toyota");
Motor m = new Motor();
m.setCilindros(6);
m.setPotencia(100);
c.setMotor(m);
System.out.println(c.getMotor().getPotencia());
}
}
El concepto de Delegación
Como podemos ver acceder en nuestro código a la potencia es un poco enrevesado. Podemos apoyarnos en el concepto de delegación y generar nuevos métodos a nivel de la clase Coche para que “delegen” en los de motor y todo sea más sencillo.

Eclipse y Refactorings
Para construir estos nuevos métodos nos vamos a apoyar en el eclipse y en sus capacidades de refactoring. Nos posicionamos en la clase Coche y pulsamos boton derecho Source –>Generate Delegate Methods.

Una vez seleccionada esta opción Eclipse nos permitirá seleccionar que métodos queremos generar como delegados. Marcamos los de potencia y cilindros que pertenecen al Motor.

Eclipse automaticamente nos generará los nuevos métodos en la clase Coche:
public int getPotencia() {
return motor.getPotencia();
}
public void setPotencia(int potencia) {
motor.setPotencia(potencia);
}
public int getCilindros() {
return motor.getCilindros();
}
public void setCilindros(int cilindros) {
motor.setCilindros(cilindros);
}
Ahora podremos asignarlos directamente de una forma mucho más cómoda:
public class Principal {
public static void main(String[] args) {
Coche c = new Coche();
c.setMarca("Toyota");
Motor m = new Motor();
m.setCilindros(6);
m.setPotencia(100);
c.setMotor(m);
System.out.println(c.getPotencia());
}
}
Hemos implementado el concepto de delegación de una forma automática. La delegación también la podriamos haber implementado a nivel de constructor si nos fuera necesario . Ese concepto permite simplificar la forma en la que trabajamos con las clases en estructuras de composición complejas.
Pues sinceramente a la hora de hacer los set() del coche se podían haber usado también directamente los set.
c.setMarca(“Toyota”);
c.setMotor(new Motor());
c.setPotencia(100);
c.setColindros(6);
si por supuesto
Simplemente maravilloso
Hola. Creo que en el párrafo titulado “El concepto de delegación” se te ha escapado una clase “Persona” donde debería poner “Coche”, seguramente de otro ejemplo práctico.
gracias , corregido 🙂
Hola,
genial ejemplo. Esta es la forma de solucionar lo que dice la Ley de Demeter? Tenia entendido que no es recomendable nunca hacer mas de un .getXXX() y nose si con esto es la manera de evitarlo
Gracias!
Si porque si modificaras el constructor y pasaras la potencia etc el motor quedaría oculto