2014-02-11 66 views
1

我正在用java写一个简单的程序。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/movieNumber是3,当我叫出2张票时,id将是2. 有人可以帮助我吗?我认为使用静态和最终会帮助我,但我想这是我缺少的东西。

+2

您应该查看'currentMovieNumber'特定的实例,而不是'movieNumber'。 –

+0

当我创建3个Ticket时,我得到'0','1'和'2'的currentMovieNumber。 – rgettman

+0

电影的* ID *应该是'currentMovieNumber'。这应该按预期工作。 @rgettman这不是你想要的吗? – Christian

回答

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为一个特定的票搞定,和标题。他们没有业务看柜台。

这样做的缺点是,你不能轻易将计数器复位,或恢复它,当你下一次运行程序等。要做到这一点,你可能需要一个TicketFactory它有一个实例领域反,以及一个createTicket的实例方法,它通过分配下一个ID来创建票据等。Ticket本身则不知道柜台。

+0

谢谢!我的错误是我使用movieNumber而不是currentMmvieNumber。下次我会尽量多关注。 –

0

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

使用int而不是Integer应该解决这个问题。

相关问题