有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

免责声明:我对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) 个答案

  1. # 1 楼答案

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

    • 考虑不使用Enum.ordinal()。如果您只关心“一”个时间点,它就可以正常工作,但是如果您以某种方式持久化数据,那么当您想要比较不同的持久化数据时(同时枚举也发生了变化),情况就会发生变化
    • 可以考虑LongAdder。<李>

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

  2. # 2 楼答案

    Lombok的@Builder+@Singular会自己用一个空的ArrayList来初始化你的List,就是这样(他们不会用任何元素来初始化这个List,比如零)@Builder.Default可以做到这一点(你不需要@Singular),但如果可能的话,我不会走这条路

    我不完全理解你想做什么,例如,我不知道你是只有一个enumMyEnum),还是有多个enum

    如果您只有MyEnum,那么使用与List不同的数据结构会比好得多:

    1. 一个^{}是一个简单的选择,因为它是Java的原生版本:

      • 初始化:EnumMap<MyEnum, Integer> myMap = new EnumMap<>(MyEnum.class)
      • 递增:myMap.merge(myEnum, 1, Integer::sum)
      • 最终结果:myMap.getOrDefault(myEnum, 0)
    2. 不过,最好的数据结构是multiset。一个支持mulitsets的外部库是Guava,其^{}

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

    按照您的体系结构,我猜您必须在使用Lombok的类中初始化列表。这可以通过以下方式实现:

    @Builder
    public class Foo {
    
      @Builder.Default
      private List<Integer> myList = Arrays.asList(0, 0, 0);
    
    }
    

    Arrays.asList是使用标准Java库用默认值初始化列表的方法。我知道使用名为Arrays的类而不是List或Collection可能会有点混乱,但您可以找到有关其Javadoc(herejava8的doc)的更多信息。初始化的结果是一个三个整数设置为0的列表。你只需要把你需要的东西放进去

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

    为了简单起见,我只提供了初始化列表和生成器的非常具体的代码。请注意,您可能还希望结合使用Lombok注解@Data和@AllArgsConstructor

    你可以找到关于the Lombok official documentation的更多信息