Объекты отслеживания Java с идентификатором - PullRequest
1 голос
/ 23 февраля 2012

У меня есть этот класс, который каждый раз, когда я вызываю конструктор, должен увеличивать 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;
          }
}  

Так что мои сомнения возникают здесь: предположим, у меня есть класс Elections, который вызывает конструктор Candidato, как я могу отслеживатьидентификатор Candidato каждый раз, когда создается новый экземпляр выборов?

Как и в этом примере в testNumeriCandiati (), я получаю некоторые странные числа, поскольку они не являются ожидаемыми, поэтому каждый раз, когда я создаю класс Election, я хочу установитьидентификатор Candidato возвращается к 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 ]

2 голосов
/ 23 февраля 2012

Ваш счетчик хранится как статическая переменная 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;
    }

}
2 голосов
/ 23 февраля 2012

Пусть класс Elections создаст объекты Candidato и заставит каждый экземпляр Elections отслеживать количество созданных объектов Candidato.

2 голосов
/ 23 февраля 2012

Если вы хотите, чтобы идентификатор кандидата был уникальным для каждого кандидата в рамках определенных выборов , то либо a) он должен быть глобально уникальным (и не перезапускаться с нуля для каждых выборов).

Или б) если вам нужно, чтобы число перезапускалось с нуля для каждого избрания, то вам нужен другой подход:

Поскольку у вас есть идентификатор в качестве статического поля в классе Кандидат, он распределяется между всеми Кандидатами, независимо от выбора.

Как насчет того, чтобы переместить счетчик идентификаторов в Election и сделать его экземпляром, а не классом, переменной?

1 голос
/ 23 февраля 2012

статический счетчик в Candidato.Используйте его при назначении реального идентификатора.

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

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

Затем при создании нового экземпляра Candidato в классе Elezione идентификатор вновь созданного экземпляра Candidato получит увеличенный идентификатор (статический, следовательно, онбудет передан всем экземплярам Candidato)

...