Java-为对象的每个实例提供唯一的编号

时间:2014-02-11 17:26:26

标签: java variables object numbers final

我正在编写一个简单的程序在java中编写。

我有一个名为ticket的课程,我有:

public class Ticket {
public String movieTitle = null;
public static Integer movieNumber = 0;
public final Integer currentMovieNumber;

public Ticket(String movieTitle) {
    currentMovieNumber = movieNumber++;
    this.movieTitle = movieTitle;
}

}

现在,当我在另一个班级中调出票证并运行程序来获取id的号码时,它们都是一样的。 如果我调出3张票,每个id / movieNumber为3,当我调出2张票时,id为2。 有人可以帮我这个吗?我认为使用静态和最终会帮助我,但我想有些东西我不知道。

2 个答案:

答案 0 :(得分:2)

听起来你正在从另一个班级看movieNumber,这是不合适的。我会这样写:

import java.util.concurrent.atomic.AtomicInteger;

public class Ticket {
    private static final AtomicInteger ticketCounter = new AtomicInteger();
    private final int ticketId;
    private final String movieTitle; // Or a reference to a Movie...

    public Ticket(String movieTitle) {
        this.movieTitle = movieTitle;
        this.ticketId = ticketCounter.incrementAndGet();
    }

    public int getTicketId() {
        return ticketId;
    }

    public String getMovieTitle() {
        return movieTitle;
    }
}

现在这些字段是私有的,其他类不能查看错误的值 - 相反,它们只能获取特定故障单的ID和标题。他们没有看着柜台的生意。

这样做的缺点是你不能轻易地重置计数器,或者在你下次运行程序时恢复计数器等。为了达到这个目的,你可能想要一个{em}实例的TicketFactory 计数器的字段,以及createTicket的实例方法,它通过为其分配下一个ID等来创建故障单。Ticket本身就不知道该计数器。

答案 1 :(得分:0)

我认为这是因为你使用了包装类,即Integer而不是int,这意味着在类字段中你只存储引用。这意味着在你的构造函数中,你实际上是链接每个类' currentMovieNumber static movieNumber movieNumber,以便在您增加Ticket时,因为所有实例都是int数字指向它,每个Integer将具有相同的递增数字。

使用{{1}}代替{{1}}可以解决此问题。