我有一个类(汽车),它有一个int ID实例变量。
ID不一定必须是唯一的 - 它更像是一个类别ID。
如果ID存在,我将该对象添加到该类别中的数组列表(如果该ID不存在)我创建一个具有该ID的新类别
在创建此类的实例之前,我想检查是否已存在具有该ID的实例变量。
我现在能想到的唯一方法就是在赛车中使用所有赛车的静态arraylist。然后,我通过每辆车搜索数组列表并比较ID以查看是否存在已匹配的ID。如果不是 - 我使用新ID创建新的汽车实例。
当然有更好的方法吗?
答案 0 :(得分:0)
使用Map,如Lutz Horn所建议的,是保存所有ID的更好方法,HashMap通常会在O(1)的运行时复杂度中执行此操作,而不是搜索容器的所有元素,例如列表
如果可以使用多个线程同时创建汽车,您当然应该确保不输入竞争条件。
答案 1 :(得分:0)
首先,如果您希望您的id是唯一的,那么您的类设计应至少具有某种形式的机制来防止重复,而不是每次创建新对象时都检查所有现有ID。
下面显示了您可以考虑的一个示例:
public class Car{
private static int counter = 1;
private int id;
public Car(){
id = counter ++; //auto-generate a new id when car is created
}
}
示例:强>
Car c1 = new Car(); //id is 1
Car c2 = new Car(); //id is 2
Car c3 = new Car(); //id is 3
答案 2 :(得分:0)
使用地图对您的问题来说是个不错的选择。但是在语义上讲,在Car类中包含该地图并不会让人感觉良好。也许更有可能在 CarFactory 或 CarManager 类
假设你正在使用CarFactory:
public class Car {
public Car(String ID) {
// construct the instance
}
// car's behaviour here
}
public class CarFactory {
private Map<String, Car> existingCars;
private CarFactory() {
existingCars = new HashMap<>();
}
private static CarFactory factory;
public static CarFactory getFactory() {
if (factory == null) {
factory = new CarFactory();
}
return factory;
}
// Now our method
public Car getBrandNewCar(String ID) {
if (existingCars.containsKey(ID) {
throw new IllegalArgumentException("The car already exists...");
} else {
Car car = new Car(ID);
existingCars.put(ID, car);
return car;
}
}
}
作为此方法的替代方法,您可以使用每次调用时生成唯一ID的方法,因此在使用之前无需检查它。例如,通过 @Julien Lopez 在评论
中共享的链接