0

Tengo una serie de jugadores con una serie de atributos, entre ellos, codigoJugador. El codigoJugador es un ID que debe ser ínico y aumentar con cada nuevo jugador creado. Mi problema es que sé definir el atributo (no sé si está bien) pero no sé cómo hacer para que ese ID se modifique cada vez que se cree un objeto jugador. También tengo otra clase equipo que lleva un array de jugadores.

Lo he definido como String, pero me vale como int que empiece en 0 y aumente progresivamente cada vez que se cree un objeto.

public class JugadorRugby {

    private String nombreJugador;
    private byte dorsal;
    private LocalDate fechaNacimiento;
    private String paisNacimiento;
    private double salario;
    private String demarcacion;
    private boolean comunitario;
    private String codigoJugador;

    public JugadorRugby(String nombreJugador, byte dorsal, LocalDate fechaNacimiento, String paisNacimiento, double salario, String demarcacion, boolean comunitario) {
        this.setNombreJugador(nombreJugador);
        this.setDorsal(dorsal);
        this.fechaNacimiento = fechaNacimiento;
        this.paisNacimiento = paisNacimiento;
        this.setSalario(salario);
        this.setDemarcacion(demarcacion);
        this.comunitario = comunitario;
        this.codigoJugador=generarCodigoJugador();
    }

    public JugadorRugby() {
        this.setNombreJugador("");
        this.setDorsal((byte)0);
        this.fechaNacimiento = LocalDate.of(2019, 1, 1);
        this.paisNacimiento = "España";
        this.setSalario(0);
        this.setDemarcacion("Defender");
        this.comunitario = true;
        this.codigoJugador=generarCodigoJugador();
    }

}
2
  • Si lo vas a llevar a BBDD quizas te sea mas facil que sea la BBDD la que te de el código con secuencias/auto_increments.
    – JDev
    Commented el 12 mar. 2019 a las 17:00
  • no no es tan complicado es un simple programa sin base de datos ni nada del estilo
    – unknow
    Commented el 12 mar. 2019 a las 17:01

2 respuestas 2

6

Si no es obligatorio que sea un secuencial numérico y te vale con un string como dices, la mejor manera de obtener id's únicos es mediante la clase UUID:

public string generarCodigoJugador(){
    UUID uuid = UUID.randomUUID();
    return uuid.toString();
}

public JugadorRugby() {
    this.setNombreJugador("");
    this.setDorsal((byte)0);
    this.fechaNacimiento = LocalDate.of(2019, 1, 1);
    this.paisNacimiento = "España";
    this.setSalario(0);
    this.setDemarcacion("Defender");
    this.comunitario = true;
    this.codigoJugador=generarCodigoJugador();
}
4
  • vale pero eso como lo meto como atributo de la clase? el constructor con eso saldria solo o debo meterlo a mano? soy muy nuevo y mi profesor bastante malo jaj gracias por la ayuda
    – unknow
    Commented el 12 mar. 2019 a las 16:58
  • jeje, lo tendrías que utilizar en el constructor. Piensa que cada vez que creas una instancia de este objeto se llama al constructor para inicializar dicha instancia. Commented el 12 mar. 2019 a las 17:00
  • ahora si perfecto muchas gracias
    – unknow
    Commented el 12 mar. 2019 a las 17:01
  • Para los interesados en saber que tan unico es UUID :) El riesgo anual de que una persona determinada sea golpeada por un meteorito se estima que es una posibilidad entre 17 mil millones, lo que significa que la probabilidad es de aproximadamente 0.00000000006 (6 × 10^−11), equivalente a la probabilidad de crear unas decenas de billones de UUID en un año y teniendo un duplicado. En otras palabras, solo después de generar 1 mil millones de UUID por segundo durante los próximos 100 años, la probabilidad de crear un solo duplicado sería aproximadamente del 50%. Commented el 12 mar. 2019 a las 17:48
2

Esto es lo que yo le implementaria, creo que es mejor esta opcion que con un String, un atributo compartido para la clase que se genere conforme crees objetos. Se crean consecutivamente. Se inicializa a cero y a partir de ahi se generaran automaticamente. Mucho mas sencillo.

public class JugadorRugby {
    private String nombreJugador;
    private byte dorsal;
    private LocalDate fechaNacimiento;
    private String paisNacimiento;
    private double salario;
    private String demarcacion;
    private boolean comunitario;
    private int codigoJugador;
    public static int conCodigoJugador = 0;

   public JugadorRugby(String nombreJugador, byte dorsal, LocalDate fechaNacimiento, String paisNacimiento, double salario, String demarcacion, boolean comunitario) {
        this.setNombreJugador(nombreJugador);
        this.setDorsal(dorsal);
        this.fechaNacimiento = fechaNacimiento;
        this.paisNacimiento = paisNacimiento;
        this.setSalario(salario);
        this.setDemarcacion(demarcacion);
        this.comunitario = comunitario;
        this.codigoJugador=conCodigoJugador++;
    }

   public JugadorRugby() {
        this.setNombreJugador("");
        this.setDorsal((byte)0);
        this.fechaNacimiento = LocalDate.of(2019, 1, 1);
        this.paisNacimiento = "España";
        this.setSalario(0);
        this.setDemarcacion("Defender");
        this.comunitario = true;
        this.codigoJugador=conCodigoJugador++;
    }

}

Si necesitas una solución threadSafe debes utilizar algo así:

private static AtomicInteger idCodigoJugador = new AtomicInteger(0);

public int getNextId() {
    return idCodigoJugador.incrementAndGet();
}
public JugadorRugby() {
    // ...
    this.codigoJugador = getNextId();
}
2
  • algo asi dijo el profesor pero como se explica como el culo pues no me entere gracias
    – unknow
    Commented el 12 mar. 2019 a las 19:21
  • En mi humilde opinión esta implementación es válida sólo para entornos mono proceso. Commented el 12 mar. 2019 a las 22:37

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.