JAVA - 为每个创建的新对象分配特定变量的程序

JAVA - program that asigns a specific variable to every new object created

我有一个名为 Worker 的摘要 class,它由两个子 class 扩展,PermanentWorkerNonPermanentWorker。所有这些 classes 都继承了各种属性,其中之一是 wCode,一个应该在创建时自动提供给每个新 worker 的 int。例如,第一个工人应该 wCode=XXX1,第二个工人 wCode=XXX2 等(XXX 是一些三位数,如 123,无关紧要)

问题是,如何检查对象是否已经创建(或未创建)以便它接收适当的代码?很明显应该使用 if-else 命令块,但具体如何使用呢?我原来的方法是这样的:

public abstract class Worker
    {
    private int wCode;

[....]

public Worker() {
      int i=1;
      if(....) wCode = 1230 + i;
      i++; }
public abstract class Worker {
  private static int lastId = 0;

  protected final int wCode;

  public Worker() {
    wCode = lastId++;
  }
}

您需要一个静态字段作为您的 ID 生成器。 wCode 将在 worker class 中初始化,您不必担心 ID 已被使用,因为它不会发生。

如果您确实需要跟踪 Worker 并检索它们,您可以将它们存储在 Set<Worker> 静态字段或 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); 一样简单,因为wCode 设置为 50 的 Worker 将在该列表的索引 50 处找到。

您必须在工作器中创建此变量 class :

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

当你创建一个新的 worker 时,在 constructor 中给它一个自动 ID :

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

这样你就可以保证每个新创建的工人都有自己的 ID。