2014-02-11 98 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應該解決這個問題。

相關問題