Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—为对象的每个实例指定一个唯一的编号_Java_Variables_Object_Numbers_Final - Fatal编程技术网

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++;

我让Troble用java编写一个简单的程序

我有一门课叫票,我有:

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。下次我会更加注意的。