JAVA - программа, которая присваивает указанную переменную c каждому новому созданному объекту - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть абстрактный класс с именем Worker, который расширен двумя подклассами, PermanentWorker и NonPermanentWorker. Все эти классы наследуют различные свойства, одним из которых является wCode, int, который должен быть предоставлен каждому новому работнику автоматически при его создании. Например, первый рабочий должен иметь wCode=XXX1, второй wCode=XXX2 et c. (XXX - это три числа типа di git, например 123, не имеет значения)

Вопрос в том, как проверить, был ли объект уже создан (или нет), чтобы он получал соответствующий код? Как будто очевидно, что должен использоваться блок команд if-else, но как именно? Мой оригинальный подход был примерно таким:

public abstract class Worker
    {
    private int wCode;

[....]

public Worker() {
      int i=1;
      if(....) wCode = 1230 + i;
      i++; }

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Вы должны создать эту переменную в рабочем классе:

  public abstract class Worker
        {
        private static int idGenerator;
        private int id;
        }

Когда вы создаете нового работника, присвойте ему автоматический c ID в конструкторе :

       public Worker () {
       this.id = idGenerator++;
       }

Таким образом, вы гарантируете, что каждый новый созданный работник получит свой собственный идентификатор.

0 голосов
/ 29 апреля 2020
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 в этом списке.

...