Получение одинакового значения переменной-члена в java

Bhawandeep Singla спросил: 28 марта 2018 в 02:29 в: java

Я написал тестовую программу в java, в которой у объекта есть 3 параметра:

id, name and age.

Имя и возраст инициализируются с использованием конструктора, но идентификатор должен автоматически увеличиваться с последнего id , (и он должен начинаться с 1 для 1-го созданного объекта).

Я использовал id как статическую переменную для достижения того же.

import java.util.*;class Test
{
    private static int id = 1;
    private int age;
    private String name;    public Test(String name, int age)
    {
        this.id = id;
        this.age = age;
        this.name = name;
        id++;
    }    public String toString()
    {
        return id + " " + name + "," + age;
    }    public static void main(String args[])
    {   
        Test c1 = new Test("A", 12);
        Test c2 = new Test("B", 32);
        Test c3 = new Test("C", 58);
        Test c4 = new Test("D", 17);
        Test c5 = new Test("E", 42);        ArrayList<Test> testList =  new ArrayList<Test>();        testList.add(c1);
        testList.add(c2);
        testList.add(c3);
        testList.add(c4);
        testList.add(c5);        for(int i = 0; i < testList.size(); i++)
            System.out.println(testList.get(i).toString());
    }
}

Но на выходе я получаю одинаковый идентификатор для всех тестовых объектов.

Может кто-нибудь объяснить, почему это происходит?

Любая помощь будет высоко оценен.

1 ответ

Есть решение
Emil Borconi ответил: 28 марта 2018 в 02:43

Статическая переменная означает, что переменная является общей для всех экземпляров данного класса, если вы измените значение статической переменной в одном из экземпляров, оно будет изменено во всех.

Что Вы хотите выполнить, вероятно, выполнимо следующим образом:

class Test
{
    public static int counter = 1;
    private int id;
    private int age;
    private String name;    public Test(String name, int age)
    {
        this.id = counter;
        this.age = age;
        this.name = name;
        counter++;
    }    public String toString()
    {
        return id + " " + name + "," + age;
    }
....

Сделайте счетчик общедоступным, вам может понадобиться сослаться на него из-за пределов экземпляра класса, или если вы не можете себе позволить выставьте его как публичный, сделайте его приватным и создайте для него статический геттер, который позволит вам получить текущий счетчик идентификатора извне класса.

Другой вариант - использовать шаблон фабрики, но, вероятно, в этом нет необходимости. для этого конкретного случая.