2011-07-11 248 views
1

美好的一天!Java構造函數

我創建重載的構造函數如下:

public ContactsBean(String firstName, String lastName, 
       String telNumber, String email) { 
    this.id = count; 
    count = count + 1; 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.email = email; 
    this.telNumber = telNumber; 
} 

public ContactsBean() { 
    this.id = count; 
    count = count + 1; 
} 

我想自動遞增的ID,所以我用這個變量:

private static int count; 
    private int id; 

我的問題是,當我實例化ContactsBean() contacts = new ContactsBean()中, id的值增加2 .. 2,4,6,8 ...等

爲什麼?我怎樣才能將ID增量的自動編號加1?

謝謝。

編輯:

操作:

private ContactsBean contacts = new ContactsBean(); 
private ContactsManager contactsManager = new ContactsManager(); 

    public String add() { 
     contactsManager.addContacts(contacts); 
     return SUCCESS; 
    } 

經理:

private ContactsDAO contactsDAO = ContactsDAO.getInstance(); 
private List<ContactsBean> contactsList = contactsDAO.getContactsList(); 

public void addContacts(ContactsBean contact) { 
    contactsList.add(contact); 
} 
+4

請給一個簡短而完整的程序whic h顯示了問題。 –

+2

調用代碼中必須有錯誤。你必須初始化相同的變量兩次或類似的東西。 –

+0

重載不是一個問題,因爲其他構造函數沒有被調用。問題在這段代碼之外,也許在實例化這個bean的代碼中。你使用任何框架還是普通的Java? –

回答

5

首先,DRY(不要重複自己),會更好:

public ContactsBean(String firstName, String lastName, 
       String telNumber, String email){ 
    this(); 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.email = email; 
    this.telNumber = telNumber; 
} 

第二,在你的代碼中沒有增加兩個。請粘貼您的測試代碼。

2

嘗試從 ContactsBean() contacts = new ContactsBean();去除第一組括號。 也就是說,試試這個構造:

ContactsBean contacts = new ContactsBean(); 
+0

這是刪除編譯時錯誤(如果它是原始代碼的一部分)。 –

0
private static int count = 0; 
private int id; 
// ... 
public ContactsBean(String firstName, String lastName,String telNumber, String email) 
{ 
    this(); 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.email = email; 
    this.telNumber = telNumber; 
} 
public ContactsBean() 
{ 
    id = ++count; 
} 
+0

新手不能調用* that *構造函數... –

+0

@Andreas_D修復。謝謝 :) –

2

我認爲你在其他類中創建了兩個ContactsBean對象,可能你並不知道它。你必須檢查代碼。

2

你是否嘗試過調試你的代碼,在這兩個構造函數上設置斷點?

Eng。的建議。 Fouad是一個很好的提示,但它不會解決你的問題。

另外請注意,您的計數器是不是線程安全(問題無關,用它做,但在這種情況下,您的計數器將有一個較低的值比它應該)

如果你真的需要跟蹤你實際創建了多少對象,我認爲最好的辦法是在Java Bean中使用靜態屬性...

2

這可能是由於複製構造函數調用了no-arg你的結構的版本。

(或者我從C++疾病者?)

2

我的建議是不要試圖遞增的ContactID的構造器,但無論是從其中ID是由增加新創建的數據庫對象得到它databse通過身份規範,或者因爲你正在獲取聯繫人列表的基礎,你的下一個id脫離contactsDAO.getContactsList()。size()+ 1。

我也建議更改:

private ContactsDAO contactsDAO = ContactsDAO.getInstance(); 
private List<ContactsBean> contactsList = contactsDAO.getContactsList(); 

public void addContacts(ContactsBean contact) { 
    contactsList.add(contact); 
} 

喜歡的東西:

private ContactsDAO contactsDAO = ContactsDAO.getInstance(); 
private List<ContactsBean> contactsList; 

public void addContacts(ContactsBean contact) { 
    int id = getContactList().size()+1; 
    contact.setId(id); 
    contactsList.add(contact); 
} 

public List<ContactsBean> getContactList(){ 
    return contactsDAO.getContactsList(); 
} 

相反,如果你能夠從數據庫中刪除聯繫人,這個數字可能會不準確的ID。你可以創建一個基於如下查詢:

select MAX(ID) from contacts 

這將返回使用的最大的id號。

0

我瞭解到,Struts2的生成對象的實例(豆子)在Action類自動所以無需實例吧....

我的代碼之前就是

private ContactsBean contacts = new ContactsBean(); 
private ContactsManager contactsManager = new ContactsManager(); 

    public String add() { 
     contactsManager.addContacts(contacts); 
     return SUCCESS; 
    } 
    //getters and setters 

我改變了它到..

private ContactsBean contacts; 
private ContactsManager contactsManager = new ContactsManager(); 

    public String add() { 
     contactsManager.addContacts(contacts); 
     return SUCCESS; 
    } 
//getters and setters 

和它的作品...