используйте Lombok @Builder @Default @Singular для инициализации List <> - PullRequest
0 голосов
/ 03 декабря 2018

Отказ от ответственности: Я новичок в Java:)

Я запускаю несколько выборок для некоторых данных и для отслеживания того, что происходит на каждом этапе выбора, который я использую int счетчики.Все эти счетчики находятся в объекте данных:

public class MyCounters {
    private int counter0;
    private int counter1;
    ...
}

Я также должен подсчитать, сколько кандидатов попадают в данное количество категорий, которые я считаю с enum.Для этого я создал List<Integer>, где индекс списка охватывает значения перечисления.

private List<Integer> myList;

А позже в коде мне нужен специальный метод для инициализации списка с нулями:

for (MyEnum i : MyEnum.values()) {
    myList.add(0);
}

Тогда в основном коде после назначения последней категории это происходит:

myCounters.getMyList().set(myEnum.ordinal(), myCounters.getList().get(myEnum.ordinal()) + 1);

Мне было предложено улучшить этапы объявления / инициализации с помощью функциональности @Builder.Default Lombok.(или, может быть, @Singular), но я не могу понять, как это сделать: в конце концов, мне нужно инициализировать List<Integer> таким количеством нулей, как значения в enum.Реально ли это сделать с помощью расширений Lombok?Или они нацелены на что-то другое?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Честно говоря, я предлагаю другую архитектуру:

  • Не используйте Enum.ordinal () .Это будет работать нормально, если вы просто заботитесь об «одном» моменте времени, но если вы каким-то образом сохраняете свои данные, то все разбивается на части, как только вы захотите сравнить разные сохраненные данные (и перечисление изменилось за это время)
  • Возможно, рассмотрим LongAdder .

Значение: используйте Map<YourEnumType, LongAdder> для подсчета вещей.Получить счетчик, вызвать его метод add(), готово.

0 голосов
/ 03 декабря 2018

Придерживаясь своей архитектуры, я думаю, вам нужно инициализировать список в классе, который использует Lombok.Это может быть достигнуто следующим образом:

@Builder
public class Foo {

  @Builder.Default
  private List<Integer> myList = Arrays.asList(0, 0, 0);

}

Arrays.asList - это способ инициализации списка значениями по умолчанию с использованием стандартных библиотек Java.Я знаю, что может быть немного странно использовать класс с именем Arrays вместо List или Collection, но вы можете найти больше информации о его Javadoc ( здесь документ для Java 8).Результатом этой инициализации является список с тремя целыми числами, установленными на 0. Вам просто нужно указать столько, сколько вам нужно.

Причина использования аннотации @Builder.Default в поле myList состоит в том, чтобыконструктор-конструктор знает об инициализации по умолчанию, которая в противном случае была бы пропущена компоновщиком Lombok.

Для краткости я включил только очень специфический код для инициализации вашего List и компоновщика.Обратите внимание, что, вероятно, вы захотите использовать аннотации Lombok @Data и @AllArgsConstructor в сочетании с ним.

Дополнительную информацию о можно найти в официальной документации Lombok

0 голосов
/ 03 декабря 2018

Ломбок @Builder + @Singular самостоятельно инициализирует ваш List с пустым ArrayList, и все (они не инициализируют List какими-либо элементами, такими как нули).@Builder.Default мог бы сделать это (тогда вам не нужно @Singular), но я бы не стал следовать этому пути, если это возможно.

Я не совсем понимаю, что вы хотите сделать, например, я нене знаю, есть ли у вас только один enum (MyEnum), или если есть более одного enum.

Если у вас есть только MyEnum, вы будете намного лучше с использованием структуры данных, отличной от List:

  1. EnumMap является простым выбором, поскольку он является родным для Java:

    • инициализация: EnumMap<MyEnum, Integer> myMap = new EnumMap<>(MyEnum.class)
    • с приращением: myMap.merge(myEnum, 1, Integer::sum)
    • конечный результат: myMap.getOrDefault(myEnum, 0)
  2. Лучшийструктура данных для этого, однако, будет multiset .Одной внешней библиотекой, поддерживающей множественные наборы, является Гуава с ее Multiset:

    • инициализация: Multiset<MyEnum> myMultiset= HashMultiset.create()
    • с приращением: myMultiset.add(myEnum)
    • окончательный результат: myMultiset.count(myEnum)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...