Java—为对象的每个实例指定一个唯一的编号
我让Troble用java编写一个简单的程序 我有一门课叫票,我有:Java—为对象的每个实例指定一个唯一的编号,java,variables,object,numbers,final,Java,Variables,Object,Numbers,Final,我让Troble用java编写一个简单的程序 我有一门课叫票,我有: public class Ticket { public String movieTitle = null; public static Integer movieNumber = 0; public final Integer currentMovieNumber; public Ticket(String movieTitle) { currentMovieNumber = movieNumber++;
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/电影号码是3,当我叫2张票时,id将是2。
有人能帮我吗?我原以为使用static和final会对我有所帮助,但我想我遗漏了一些东西。听起来你在看另一个类中的
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和标题。他们没必要看柜台
这样做的缺点是,您无法轻松重置计数器,或者在下次运行程序时恢复计数器。为了实现这一点,您可能需要一个
TicketFactory
,其中包含计数器的实例字段,还有一个createTicket
的实例方法,它通过分配下一个ID等来创建一个ticket。ticket
本身就不会知道计数器。我认为这是因为您使用的是包装类,即整数
而不是int
,这意味着在类字段中只存储引用。这意味着在构造函数中,您实际上是将每个类的currentMovieNumber
链接到静态movieNumber
,因此当您递增movieNumber
时,因为所有实例的编号都指向它,所以每个票证的递增编号都相同
使用int
而不是Integer
应该可以解决这个问题。您应该查看特定实例的currentMovieNumber
,而不是movieNumber
。当我创建3个Ticket
s时,我得到0
和1
的currentMovieNumber2
。电影的ID应该是currentMovieNumber
。这应该像预期的那样起作用@这不是你想要的吗?@Christian我只是想指出,currentMovieNumber
对我来说似乎是正确的。正如Jon Skeet所建议的,OP可能正在查看movieNumber
,static
变量,并查看所有3个Ticket
s的3
。@targetman抱歉,我以为你就是OP。是的,这可能就是问题所在。谢谢!我的错误是我用了movieNumber而不是currentMmvieNumber。下次我会更加注意的。