Java跟踪具有ID的对象

时间:2012-02-23 12:37:10

标签: java encapsulation

我有这个类,每次调用构造函数时都应该增加id

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

所以我的怀疑在这里出现:假设我有一个叫做Candidato构造函数的选举,每次创建新的选举实例时我如何跟踪Candidato id?

就像在testNumeriCandiati()的这个例子中一样,我得到一些奇怪的数字,因为它们不是预期的数字,因此每当我创建一个Election类时,我想将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());
    }
}

4 个答案:

答案 0 :(得分:2)

让Elections类创建Candidato对象,并使每个Elections实例跟踪创建的Candidato对象的数量。

答案 1 :(得分:2)

如果您希望候选ID对于特定选举中的每个候选人是唯一的,则a)它必须是全局唯一的(并且不会从每次选举的零重启)。

或者b)如果您需要为每次选举从零开始重新开始,那么您需要采用不同的方法:

由于您在候选人类中将ID作为静态字段,因此无论选举如何,都会在所有候选人之间共享。

如何将ID计数器移动到Election并使其成为实例,而不是类,变量?

答案 2 :(得分:2)

您的计数器存储为Candidato的静态变量,因此其值不依赖于Elezione实例的创建。如果您需要此功能,则需要将Candidato的计数器设置为Elezione

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

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

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

}

答案 3 :(得分:1)

Candidato的静态计数器。分配真实身份时使用它。

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

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

然后当您在Elezione类中创建Candidato的新实例时,新创建的Candidato实例的id将获得递增的id(静态,因此,它将与Candidato的所有实例共享)