Java使用实例方法而不是类/静态方法为每个实例化对象创建唯一ID

时间:2016-02-17 15:58:09

标签: java static increment uniqueidentifier instance-methods

对此非常新,所以我希望我的标题中有术语。

我想弄清楚如何创建一个实例方法来执行以下操作:

- 返回ID号。

- 由于每个对象都是从类构造函数(实例化?)创建的,因此会为其分配唯一的整数ID号。第一个ID号是1,当实例化新对象时,将分配连续的数字。

我能够找到执行上述操作的类/静态方法的示例,但是我无法弄清楚如何使用实例方法执行此操作。我的尝试如下:

class Coordinates
{
    private int iD = 0;
    private float xCoordinate;
    private float yCoordinate;

    public Coordinates()
    {
        //Asks for input and assigns it to the two variables below
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Please enter the X Coordinate followed by the return key");
        xCoordinate = keyboard.nextDouble();
        System.out.println("Please enter the Y Coordinate followed by the return key");
        yCoordinate = keyboard.nextDouble();

        iD++;
    }

    public getiD()
    {
        return iD;
    }

}

我的主要方法如下:

public class Machine
{
    public static void main(String[] args)
    {
        Coordinates c1 = new Coordiantes();
        Coordinates c2 = new Coordiantes();
        Coordinates c3 = new Coordiantes();

        System.out.println("ID: " + c1.getID());
        System.out.println("ID: " + c2.getID());
        System.out.println("ID: " + c3.getID());


    }
}

请注意,为了简单起见,我没有包含我的整个代码。我希望我已经足够了。

我也不想使用java.util.UUID。

4 个答案:

答案 0 :(得分:3)

维护ID序列与您的对象的其余部分是分开的责任,并且不属于Coordinates类的任何一个实例,因此它属于不同的对象。创建一个单独的对象来维护序列并分发数字,例如

public class MySequence {
    private AtomicLong currentValue = new AtomicLong(0L);
    public long getNextValue() {
        return currentValue.getAndIncrement();
    }
}

然后使用该序列初始化您的对象:

new CoordinatePair(mySequence.getNextValue(), x, y);

顺便说一下,保持用户输入与模型分离会使事情变得更简单,在输入不是来自用户的情况下,您可能希望实例化Coordinates类。控制台输入不在构造函数中。您可能有一个像

这样的Coordinate类
public CoordinatePoint {
    private long id;
    private float x;
    private float y;
    public CoordinatePoint(long id, float x, float y) {
        this.id = id;
        this.x = x;
        this.y = y;
    }
    public String toString() {
        return "id=" + id + ", (" + x + ", " + y + ")";
    }
}

之类的主要方法
public class Example {

    public static void main(String ... args) {
        MySequence seq = new MySequence();
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Please enter the X Coordinate followed by the return key");
        float xCoordinate = keyboard.nextDouble();
        System.out.println("Please enter the Y Coordinate followed by the return key");
        float yCoordinate = keyboard.nextDouble();
        CoordinatePoint c1 = new CoordinatePoint(seq.getNextValue(), xCoordinate, yCoordinate);
        System.out.println(c1.toString());
    }
}

答案 1 :(得分:3)

现在的问题是你的'id'是一个实例变量,这意味着它属于你创建的对象。 可以想象,每次创建对象时,都会创建一个新的实例变量副本。 所以每次创建一个对象时,id首先设置为0,然后post增加一次(因此所有对象的id = 0)。

如果要创建一个变量,例如,自动计算您在类中创建的所有对象或具有id,则需要创建一个类变量。 这些变量属于您从类创建的所有对象,用于该关键字的关键字是“静态”。

注意:我使用的是静态变量但不是静态方法。如果您根本不想使用静态,那么这是一个不同的问题

class Coordinates
{
private static int count = 0;
private int id=0;
private float xCoordinate;
private float yCoordinate;

public Coordinates()
{
    //Asks for input and assigns it to the two variables below
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Please enter the X Coordinate followed by the return key");
    xCoordinate = keyboard.nextDouble();
    System.out.println("Please enter the Y Coordinate followed by the return key");
    yCoordinate = keyboard.nextDouble();

    id=count++;
}

public getiD()
{
    return iD;
}

}

简单的关键字更改将使您的程序正确无误。你不必做太多复杂的事情。

首先很难掌握类和对象,静态和实例变量的概念。如果您想要更多解释,请告诉我们。)

答案 2 :(得分:1)

在当前代码的上下文中,最简单的事情如下:

else if (ResponseCode.equals("409") == true) 
{ 
   Failure = true;
    FailureMessage = "Creation of a new CAE record failed: Attempting to create a duplicate record.";
}

测试

import java.util.concurrent.atomic.AtomicInteger;

public class Coordinates {

    //static id generator shared among all instances of Coordinates 
    private static final AtomicInteger idGenerator = new AtomicInteger(1000);

    private final Integer id;

    public Coordinates() {
        //assign unique id to an instance variable
        id = idGenerator.getAndIncrement();
    }

    public int getId() {
        //return instance variable
        return id;
    }
}

输出

1000 1001 1002 1003 1004 1005 1006 1007 1008 1009

答案 3 :(得分:0)

您可以将该ID设置为静态,也可以使用“Point”子项创建一个名为“Coordinate”的Parent类(该ID再次为静态),并在每个“Point”对象的构造函数中增加ID

静态似乎是要走的路。