我正在编写一个简单的程序在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。 有人可以帮我这个吗?我认为使用静态和最终会帮助我,但我想有些东西我不知道。
答案 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}}可以解决此问题。