仅从特定且唯一的实例变量检索对象 - Java

时间:2016-11-17 13:31:32

标签: java

我有一个类(汽车),它有一个int ID实例变量。

ID不一定必须是唯一的 - 它更像是一个类别ID。

如果ID存在,我将该对象添加到该类别中的数组列表(如果该ID不存在)我创建一个具有该ID的新类别

在创建此类的实例之前,我想检查是否已存在具有该ID的实例变量。

我现在能想到的唯一方法就是在赛车中使用所有赛车的静态arraylist。然后,我通过每辆车搜索数组列表并比较ID以查看是否存在已匹配的ID。如果不是 - 我使用新ID创建新的汽车实例。

当然有更好的方法吗?

3 个答案:

答案 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 在评论

中共享的链接