2012-02-23 67 views
1

我有這個類,每次我調用構造函數應該遞增ID有ID的Java跟蹤對象

public class Candidato { 
    private String nome; 
    private String cognome; 
    private final int id;     // id that tracks number of objects 
    private static int counter=0;   //counter that increments the id 
    private static int counterd=0; 
    private static int counters=0; 
    private static int counterp=0; 
    private double voti; 
    private int doc; 
    private int stud; 
    private int pta; 

    public Candidato(String n,String c){ 
     this.id=counter++;   //everytime i call the constructor increment me 
     this.nome=n; 
     this.cognome=c; 
     System.out.println(counter+"- -"); // here 
    } 
      public int getNumero(){ 
     //System.out.println(id+"--id--"); 
      return id+1; 
      } 
} 

所以我懷疑這裏arrise:假設我有一類選舉調用Candidato構造,怎麼能每當一個新的選舉實例被創建時,我會跟蹤Candidato ID嗎?

就像在testNumeriCandiati(本例中)我得到一些奇怪的數字,因爲它們不是所預計的,所以每次我創建一個選舉類我想設置Candidato ID回到0

public class TestR2_Candidati extends TestCase { 

     public void testCandidato(){ 
      Elezione sistema = new Elezione(); 

      Candidato c = sistema.nuovoCandidato("Marco", "Gilli");  
      assertNotNull("metodo nuovoCandidato() non implemenato",c); 
      assertEquals("Marco",c.getNome()); 
      assertEquals("Gilli",c.getCognome()); 
      assertEquals(1,c.getNumero()); 
     } 

    public void testGetCandidato(){ 
     Elezione sistema = new Elezione(); 

     Candidato c = sistema.nuovoCandidato("Marco", "Gilli"); 

     Candidato cc = sistema.getCandidato(1); 

     assertNotNull("metodo getCandidato() non implemenato",cc); 

     assertSame("Non viene restituito lo stesso candidato",c,cc); 
    } 

    public void testNumeriCandiati(){ 
     Elezione sistema = new Elezione(); 

     Candidato c1 = sistema.nuovoCandidato("Marco", "Gilli"); 
     Candidato c2 = sistema.nuovoCandidato("Francesco", "Profumo"); 
     Candidato c3 = sistema.nuovoCandidato("Rodolfo", "Zich"); 

     assertEquals("Non corrisponde il numero",1,c1.getNumero()); 
     assertEquals("Non corrisponde il numero",2,c2.getNumero()); 
     assertEquals("Non corrisponde il numero",3,c3.getNumero()); 
    } 
} 

回答

2

您的計數器存儲爲一個靜態變量Candidato,因此其值不取決於創建Elezione實例。如果你想要這種功能,你需要管理的計數器爲Elezione

class Elezione { 
    private candidatoCounter = 0; 
    ................ 

    Candidato createCandidato() { 
     return new Candidato(candidatoCounter++); 
    } 
} 

class Candidato { 
    private int id; 
    Candidato(int id) { 
     this.id = id; 
    } 

} 
1

靜計數器在Candidato。當你分配一個真實的ID時使用它。

public class Candidato { 
    private static int count=0; 
    private int id; 

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

然後,當你在Elezione類中創建Candidato的新實例Candidato的新創建的實例的ID將獲得遞增的ID(靜態的,因此,將與Candidato的所有實例共享)

2

有選舉類創建Candidato對象,使每個選舉實例保持Candidato數量的跟蹤對象創建。

2

如果您希望候選ID對於特定選舉內的每個候選都是唯一的,則a)它需要全局唯一(且不必從每次選舉的零重新開始)。

或b)如果需要的數量從零重新開始每次選,那麼你需要一個不同的方法:

既然你的ID作爲候選類靜態字段,它之間共享所有候選人,無論選舉。

如何將ID計數器移動到Election並使其成爲實例而不是類變量?