Soy nuevo en la codificación orientada a objetos y tengo el siguiente problema.
(tenga en cuenta que esta solución es parte de mi problema)
Necesito una variable a la que puedan hacer referencia muchos objetos, pero mantengo información "privada" para cada objeto. Para ser más específico, creé una clase llamada Worker y quiero que cada objeto de esa clase tenga una ID única de tipo int . Entonces, el primer objeto tiene ID=1 , el segundo ID=2 , etc. Tenga en cuenta que no quiero solo un número entero aleatorio, mientras que necesito comenzar a contar desde 0 e incrementar...
Declaración e inicialización de la variable en la clase.
static private int workId = 0;e intenté implementar el incremento agregando esta línea de código en el cuerpo del constructor
workId++; Hago una instancia de algunos objetos, los agrego a una ArrayList y usando un bucle for imprimo las variables de cada objeto.
System.out.println("Worker ID: "+workerList.get(i).getWorkerId()); y getWorkerId() (método de clase) consta de
public int getWorkerId () { return this.workId; } El problema es que mi programa no imprimirá cada workID de trabajo único (porque no lo hay), sino el último valor de la variable estática (que resulta ser la cantidad de objetos).
¿Puedes describir una solución a mi problema?
Comentario convertido en respuesta:
Estás en el camino correcto.
Actualmente, su miembro estático aumentará con cada trabajador que cree. Esto significa que no contendrá la identificación de un trabajador (este no puede ser el caso, ya que una variable estática pertenece a la clase en lugar de instancias individuales), sino que contiene la cantidad total de trabajadores que creó hasta el momento.
Arreglar
numWorkers para que refleje lo que haceid (o workerId de trabajador si lo prefiere)workId++ a id = ++numWorkers¿Por qué?
Ahora, cada trabajador tiene su propia id . Lo asigna mirando el número actual de trabajadores creados ( numWorkers ), incrementa ese valor en uno y luego lo asigna a id . De esta manera, la identificación de su primer trabajador será 1 , la segunda será 2 y así sucesivamente. numWorkers siempre contiene la cantidad de trabajadores creados, que es al mismo tiempo la última identificación que entregó.
Juntar
Dado que esta pregunta obtuvo bastantes votos a favor (= interés), resumiré lo anterior en un plano:
public class Worker { private static int numWorkers; // Number of Worker objects created private int id; // Individual ID of a worker public Worker() { id = ++numWorkers; // Will be 1 for the first, 2 for the second, ... } public int getID() { return id; } public static int getNumWorkers() { return numWorkers; } } Tenga en cuenta que en Java, no necesita inicializar el tipo primitivo int en 0 , ya que ese es el valor predeterminado para un int . Por supuesto, está bien hacerlo de todos modos; nunca está de más ser explícito.
Estás bastante cerca del éxito en realidad.
Los miembros estáticos, como ya sabrá, pertenecen a la clase en sí, no a cada instancia. Pero como dijiste, cada trabajador debe tener su propia ID única, por lo que workId no debe ser estático.
Sin embargo, todavía necesitamos una variable estática para realizar un seguimiento de qué ID se debe dar al próximo trabajador que creamos. Declaremos uno:
static private int nextWorkId = 0; Luego, en su constructor, asigna nextWorkId a workId , luego incrementa nextWorkId :
workId = nextWorkId; nextWorkId++;También puedes escribirlo así:
workId = nextWorkId++;