使用Lombok @Builder @Default @Singular初始化列表<>

时间:2018-12-03 13:38:25

标签: java lombok

免责声明:我对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)来改进声明/初始化步骤,但是我真的不知道怎么做:最后,我需要初始化List<Integer>到零的数量与enum中的值相同。 使用Lombok的扩展确实可以做到这一点吗?还是他们针对其他目标?

3 个答案:

答案 0 :(得分:1)

龙目岛的@Builder + @Singular会用空的List初始化ArrayList,仅此而已(他们不会初始化此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。一种支持多音集的外部库是Guava及其Multiset

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

答案 1 :(得分:0)

老实说,我建议使用另一种体系结构:

  • 考虑不使用Enum.ordinal()。如果您只关心“一个”时间点,它将很好地工作,但是如果您以某种方式持久化数据,那么一旦您想比较不同的持久化数据(与此同时枚举发生了变化),事情就会分崩离析。
  • 也许考虑使用LongAdder

含义:使用Map<YourEnumType, LongAdder>进行计数。检索计数器,调用其add()方法,完成。

答案 2 :(得分:0)

注意您的体系结构,我想您必须在使用Lombok的类中初始化List。可以通过以下方式实现:

@Builder
public class Foo {

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

}

Arrays.asList是使用标准Java库用默认值初始化List的方法。我知道使用名为Arrays的类而不是List或Collection可能会有点混乱,但是您可以在Javadoc(here Java 8的文档)上找到更多信息。初始化的结果是一个将三个Integer设置为0的列表。您只需要输入所需的数量即可。

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

为简洁起见,我仅包含用于初始化列表和构建器的非常具体的代码。请注意,您可能还希望同时使用Lombok批注@Data和@AllArgsConstructor。

您可以在the Lombok official documentation

上找到更多信息。