Как автоматически увеличить поле в моем классе, когда я объявляю и инициализирую объект класса? - PullRequest
0 голосов
/ 12 января 2020

У меня есть 3 класса в моем Java заявлении, один из которых представляет медицинский полис:

public class MedicalPolicy implements PolicyType {
    private int id;
    // and some other fields

    public MedicalPolicy(final LocalDate effective,final LocalDate expiry,final ArrayList<Beneficiary> beneficiaries){
          //Constructor that does NOT set/initialize the id field
    }
}

Другой класс, который представляет моторную политику:

public class MotorPolicy implements  PolicyType{

    private int id;
    // and some other fields

    public MotorPolicy(final LocalDate effective,final LocalDate expiry,final double vehiclePrice){
        //Constructor that does NOT set/initialize the id field
    }
}

И третий класс содержит метод main().

Каждый раз, когда я объявляю и инициализирую объект медицинской политики в моем main(), я хочу, чтобы значение id медицинской политики увеличивалось на 1, то же самое для моторной политики, т. е. если я объявлю 2 объекта медицинской политики в моем main(), я хочу, чтобы значение 1-й медицинской политики имело id, равное 1, а 2-й медицинской политике - значение id, равное 2, и если Я объявляю 3 Motor Policy, я хочу, чтобы 1-е имело id, равное 1, 2-е id, равное 2, и 3-е id, равное 3.

Как мне сделать sh that?

PS: Нет никаких проблем, если мне нужно установить / инициализировать его из конструктора, важно то, что я не должен передавать его значение в качестве параметра конструктора.

Ответы [ 4 ]

2 голосов
/ 12 января 2020

Как я предлагал в своем комментарии, я бы добавил AtomicInteger для подсчета количества вызовов конструктора:

public class MedicalPolicy implements PolicyType {
    private static final AtomicInteger counter = new AtomicInteger();

    private final int id;

    public MedicalPolicy(
            final LocalDate effective,
            final LocalDate expiry,
            final ArrayList<Beneficiary> beneficiaries){
        id = counter.incrementAndGet();
    }
}

Причина использования AtomicInteger заключается в том, что поточно-безопасности.

Однако обратите внимание, что эта реализация учитывает только то, как часто вызывался конструктор. Чтобы подсчитать количество доступных экземпляров данного класса, мне на ум приходят два решения. Один включает переопределение finalize() (которое устарело в Java 13). Другой использует List из PhantomReference s для отслеживания достижимых экземпляров.

1 голос
/ 12 января 2020

Вы можете использовать AtomicInteger , который используется в таких приложениях, как счетчики с атомным приращением.

public class MedicalPolicy implements PolicyType {
  private static final AtomicInteger count = new AtomicInteger(); 
    // and some other fields

    public MedicalPolicy(final LocalDate effective,final LocalDate expiry,final ArrayList<Beneficiary> beneficiaries){
          //Constructor that does NOT set/initialize the id field
         count.incrementAndGet(); 
    }
}
0 голосов
/ 12 января 2020

Используйте private static int в качестве переменной экземпляра

Внутри конструктора вы устанавливаете идентификатор для серийного номера и добавляете его в последовательный.

public class MedicalPolicy implements PolicyType {
    private static int serial = 1;
    private int id;
    // and some other fields

    public MedicalPolicy(final LocalDate effective,
                         final LocalDate expiry,
                         final ArrayList<Beneficiary> beneficiaries){
      this.id = serial++;
      // Other constructor stuff
    }
}

Если ваш класс должен быть потокобезопасен, используйте AtomicInteger, как упоминалось в Turing85.

0 голосов
/ 12 января 2020

Не могли бы вы создать список, тогда каждый объект этого класса будет связан с его инкрементным положением в индексе. например. listName.get (obj num-1), поскольку первый объект будет храниться с индексом 0. Также listName.size () вернет значение, чтобы вы могли отслеживать, сколько у вас было.

...