假想车库存放车辆(汽车和自行车)。
我想要一个自动递增ID系统,但我不完全确定如何正确设置它。请参阅下面的代码......
车辆
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Car(扩展车辆)
public class Vehicle {
String make;
String model;
int year;
int id;
double bill;
}
}
答案 0 :(得分:0)
如果要生成在JVM生命周期内唯一的标识符序列,可以在超类中使用AtomicInteger
计数器。计数器将由超类构造函数递增,如下所示:
public abstract class Vehicle {
protected int id;
protected String make;
protected String model;
protected int year;
private static AtomicInteger idSequence = new AtomicInteger();
protected Vehicle(String make, String model, int year) {
this.id = idSequence.incrementAndGet();
// set the super class fields
}
}
然后,在子类中,您将在设置特定于子类的字段之前调用超类构造函数:
public class Car extends Vehicle {
private int noDoors;
public Car(String make, String model, int year, int noDoors) {
super(make, model, year);
// set the sub-class fields
}
}
答案 1 :(得分:0)
一个好的方法是使用工厂模式。工厂是为您生成对象实例的对象。然后,您有一个位置,您可以在其中管理所有对象的 ID 。
或者,您可以使用注册对象的对象。就像分发 ID 的办公室一样。
以下是使用注册方法的示例:
注册办事处 ,使用单件模式来提高使用效率:
public class IdProvider {
private static IdProvider instance = null;
public IdProvider getInstance() {
if (instance == null) {
instance = new IdProvider();
}
return instance;
}
private int nextID = 0;
public int getUniqueId() {
if (nextId < 0) {
throw new IllegalStateException("Out of IDs!");
}
int uniqueId = nextId;
nextId++;
return uniqueId;
}
}
您的对象:
public class Vehicle {
String make;
String model;
int year;
int id;
double bill;
public Vehicle() {
// Get an ID
this.id = IdProvider.getInstance().getUniqueId();
}
}
public class Car extends Vehicle {
private int noDoors;
public Car(String make, String model, int year, int noDoors) {
// An ID is fetched implicitly because
// the super-constructor of Vehicle is
// always called
this.noDoors = noDoors;
this.make = make;
this.model = model;
this.year = year;
}
}
或者,如果您要搜索快速且肮脏的解决方案,可以在Vehicle
中使用静态计数器:
public class Vehicle {
private static int nextId = 0;
String make;
String model;
int year;
int id;
double bill;
public Vehicle() {
// Get an ID
this.id = Vehicle.nextId;
// Increase the ID for the next vehicle
Vehicle.nextId++;
}
}
静态变量在类的所有实例之间共享。因此,对于所有车辆,只有一个nextId
对象,他们都可以访问它。
请注意,如果您计划在并行环境(多线程编程)中使用该代码,那么您必须注意getUniqueId
IdProvider
方法。< / p>
你需要synchronize
它。或者您也可以用AtomicInteger
替换其ID计数器的类型,它提供了AtomicInteger#getAndIncrement
(documentation)等线程安全的方法。