JAVA - 为每个创建的新对象分配特定变量的程序
JAVA - program that asigns a specific variable to every new object created
我有一个名为 Worker
的摘要 class,它由两个子 class 扩展,PermanentWorker
和 NonPermanentWorker
。所有这些 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。
我有一个名为 Worker
的摘要 class,它由两个子 class 扩展,PermanentWorker
和 NonPermanentWorker
。所有这些 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。