public abstract class Worker {
private static int lastId = 0;
protected final int wCode;
public Worker() {
wCode = lastId++;
}
}
Вам нужно поле c, которое будет вашим генератором идентификаторов. wCode
будет инициализирован в рабочем классе, и вам не нужно беспокоиться о том, что ID уже используется, потому что этого не произойдет.
Если вам действительно нужно отслеживать Worker
s и получить их, вы можете сохранить их в поле Set<Worker>
stati c или Map<Integer, Worker>
и добавить их в конструктор. например,
public class Worker {
// rest of the code omitted
// workers set
private static Set<Worker> workersSet = new HashSet<>();
// or workers map
private static Map<Integer, Worker> workersMap = new HashMap<>();
// add the instance to the set or map
public Worker() {
// id part omitted
workersSet.add(this);
// or
workersMap.add(this.wCode, this);
}
// expose the collections as read-only to outside world
public static Set<Worker> workers() {
return Collections.unmodifiableSet(workersSet);
}
public static Worker getWorker(int wCode) {
return workersSet.stream()
.filter(w -> w.wCode = wCode)
.findAny()
// or drop the orElse part and make the method return Optional<Worker>
.orElse(null);
// for map counterpart, it's easier:
// return workersMap.get(wCode);
}
}
Более простая реализация будет с List
/ ArrayList
вместо Set
/ HashSet
, а поиск будет таким же простым, как workersList.get(wCode);
, поскольку Worker
с wCode
, установленный на 50, будет найден с индексом 50 в этом списке.