В моей домашней работе у меня есть класс Java с атрибутами
private final int idOfPassenger;
private final String name;
в конструкторе, который принимает только String в качестве параметра, я должен инициализировать как имя, так и идентификатор пассажира. Но каждый раз, когда я создаю new Passenger, я должен увеличивать переменную idOfPassenger на единицу (начиная с 0), чтобы у пассажиров не было одинаковых номеров.
Мне не разрешено изменять private final или параметры конструктора.
Как увеличить idOfPassengers на 1 каждый раз, когда я создаю нового пассажира?
public class Passenger {
private final int idOfPassenger;
private final String name;
public Passenger(String name) {
this.name = name;
this.idOfPassenger = 0;
}
}




Суть конечного поля в том, что ему нельзя переназначить новое значение. Таким образом, вы не можете увеличить его. Но вы неправильно понимаете задание. Вы не должны увеличивать private final int idOfPassenger; ваших существующих объектов, но вместо этого всегда инициализируйте его на одно значение выше, чем последний созданный объект при создании нового объекта. Вы можете реализовать это поведение, введя статическое поле, принадлежащее классу, а не какому-либо конкретному объекту:
public class Passenger {
private final int idOfPassenger;
private final String name;
private static int currentId = 0;
public Passenger(String name) {
currentId++;
this.name = name;
this.idOfPassenger = currentId;
}
}
Это создаст статическое поле, принадлежащее классу, и все ваши объекты будут общими. Он инициализируется 0, затем каждый раз, когда создается новый объект, это статическое поле увеличивается, а значение final int idOfPassenger устанавливается равным текущему значению этого статического поля.
Спасибо! В коде, который вы написали, будет ли первый пассажир иметь ID 0 или ID 1?
1: Увеличение currentId происходит до того, как оно будет присвоено idOfPassenger.
Вероятно, вы намеревались иметь другую переменную, которая отслеживает следующий идентификатор для использования, который тогда не будет окончательным и будет статическим.
private static int nextPassengerId = 0;. Затем вы должны сделатьidOfPassenger = nextPassengerId;и увеличить это на единицу,nextPassengerId++;. Помните о проблемах с многопоточностью, используйтеAtomicIntegerвместоnextPassengerId, если это проблема.