Circular Unit in java

0

I would like to ask how you could solve a circular dependency:

This is the class design that I have:

Player class

public class Jugador{

private String id;
private String name;
private PowerJugador power;


public Jugador(String id, String name, PowerJugador power) {
    this.id = id;
    this.name = name;
    this.power= power;
}

public Jugador(String id, String name) {
    this.id = id;
    this.name = name;
}

// Suponer Setters y Getters y ToString

Gremio Class

public class Gremio{

private String id;
private boolean abierto;
private PowerGremio power;
private Set<Jugador> miembros;


public Gremio(String id, boolean abierto,Set<Jugador> miembros, PowerGremio power) {
    this.id = id;
    this.abierto= abierto;
    this.power= power;
    this.miembros = miembros;
}

public Gremio(String id, boolean abierto) {
    this.id = id;
    this.abierto= abierto;
    this.miembros = new HashSet<>();
}

// Suponer Setters y Getters y ToString

Power Class

public abstract class Power{

protected double currentPower;
protected boolean permanente;
protected double powerBoost;


public Power(double currentPower, boolean permanente, double powerBoost) {
    this.currentPower= currentPower;
    this.permanente= permanente;
    this.powerBoost= powerBoost;
}

// Suponer Setters y Getters y ToString

Power Player Class

public class PowerJugador extends Power{

private transient Jugador jugador;

public PowerJugador(double currentPower, boolean permanente, double powerBoost, Jugador jugador) {
    super(currentPower, permanente, powerBoost);
    this.jugador = jugador;

public PowerJugador(double currentPower, boolean permanente, double powerBoost) {
    super(currentPower, permanente, powerBoost);
}

public void pederPower(){
      if(Integer.parseInt(jugador.getId()) < 100){
           this.currentPower -= 5.0D;
           System.out.println("El jugador " + jugador.getName() 
           + " ha perdido 5 de poder");
      }
}

// Suponer Setters y Getters y ToString

PowerGremio Class

    public class PowerGremio extends Power{

private transient Gremio gremio;

public PowerGremio (double currentPower, boolean permanente, double powerBoost, Gremio gremio) {
    super(currentPower, permanente, powerBoost);
    this.jugador = gremio;

public PowerGremio (double currentPower, boolean permanente, double powerBoost) {
    super(currentPower, permanente, powerBoost);
}

@Override
public void getCurrentPower(){
      double pow = 0.0D;
      for(Jugador j : this.gremio.getMiembros()){
          pow += j.getPower().getCurrentPower();
      }
      currentPower = pow + powerBoost;
      return currentPower;
}

// Suponer Setters y Getters y ToString

Then as you can see I have a circular dependence between Player and his power and the guild and the power of the guild; Obviously this is a very minimalist design of what it is, the power has more features.

The problem is that there is a dependency of the Guild and Player object with Power and vice versa.

Player < - > Power Player Guild < - > PowerGremio

so that when I want to create a Player object I have to do this:

Jugador j = new Jugador("50","Pepe");
j.setPower(new PowerJugador(100,false,3,j));
// Y lo mismo para el Gremio
Gremio g = new Gremio("1",true);
g.añadirMiembro(j);
g.setPower(new PowerGremio(0,false,3,g));

How could you solve this circular dependency? Is my design well implemented or should I rethink it to avoid it? In that case, how can I do it correctly?

Thank you very much.

    
asked by Vml11 14.07.2018 в 14:24
source

0 answers