使用 Lombok @Builder @Default @Singular 来初始化 List<>

use Lombok @Builder @Default @Singular to initialise List<>

免责声明:我是 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);

有人建议我可以使用 Lombok 的 @Builder.Default 功能(或者可能 @Singular)改进 declaration/initialisation 步骤,但我真的不知道如何:最后我需要将 List<Integer> 初始化为与 enum 中的值一样多的零。 真的可以使用 Lombok 的扩展来做到这一点吗?还是他们的目标有所不同?

Lombok 的 @Builder + @Singular 自己会用一个空的 ArrayList 初始化你的 List,仅此而已(他们不会初始化这个 List 与任何元素,如零)。 @Builder.Default 可以做到(那时你不需要 @Singular),但如果可能的话我不会走那条路。

我不完全明白你想做什么,例如不知道你是只有一个enumMyEnum),还是不止一个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. One external library that supports mulitsets is Guava with its Multiset:

    • 初始化:Multiset<MyEnum> myMultiset= HashMultiset.create()
    • 递增:myMultiset.add(myEnum)
    • 最终结果:myMultiset.count(myEnum)

老实说,我建议使用不同的架构:

  • 考虑不使用 。如果你只关心 "one" 时间点,它会工作得很好,但是如果你以某种方式持久化你的数据,那么一旦你想要比较不同的持久化数据(并且枚举同时发生变化),事情就会分崩离析
  • 也许可以考虑 LongAdder

意思:用Map<YourEnumType, LongAdder>来数数。检索计数器,调用其 add() 方法,完成。

根据您的架构,我猜您必须在使用 Lombok 的 class 中初始化列表。可以通过以下方式实现:

@Builder
public class Foo {

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

}

Arrays.asList 是如何使用标准 Java 库初始化具有默认值的列表。我知道使用称为 Arrays 的 class 而不是 List 或 Collection 可能会有点混乱,但您可以在其 Javadoc 上找到更多信息(here [=26 的文档=] 8).该初始化的结果是一个列表,其中三个整数设置为 0。您只需要放多少就放多少。

myList 字段上使用注释 @Builder.Default 的原因是让构建器构造函数知道默认初始化,否则 Lombok 的构建器会跳过该初始化。

为简洁起见,我只包含了用于初始化列表和生成器的非常具体的代码。请注意,您可能还想结合使用 Lombok 注释 @Data 和 @AllArgsConstructor。

您可以在 the Lombok official documentation

上找到更多信息