类之间的自动增量ID - JAVA

时间:2017-09-21 22:32:38

标签: java

假想车库存放车辆(汽车和自行车)。

我想要一个自动递增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;
}

}

2 个答案:

答案 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#getAndIncrementdocumentation)等线程安全的方法。