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的扩展真的有可能做到这一点吗?还是他们的目标有所不同
# 1 楼答案
老实说,我建议采用不同的架构:
意思:用
Map<YourEnumType, LongAdder>
数数。检索计数器,调用其add()
方法,完成# 2 楼答案
Lombok的
@Builder
+@Singular
会自己用一个空的ArrayList
来初始化你的List
,就是这样(他们不会用任何元素来初始化这个List
,比如零)@Builder.Default
可以做到这一点(你不需要@Singular
),但如果可能的话,我不会走这条路我不完全理解你想做什么,例如,我不知道你是只有一个
enum
(MyEnum
),还是有多个enum
如果您只有
MyEnum
,那么使用与List
不同的数据结构会比好得多:一个^{} 是一个简单的选择,因为它是Java的原生版本:
EnumMap<MyEnum, Integer> myMap = new EnumMap<>(MyEnum.class)
myMap.merge(myEnum, 1, Integer::sum)
myMap.getOrDefault(myEnum, 0)
不过,最好的数据结构是multiset。一个支持mulitsets的外部库是Guava,其^{} :
Multiset<MyEnum> myMultiset= HashMultiset.create()
myMultiset.add(myEnum)
myMultiset.count(myEnum)
# 3 楼答案
按照您的体系结构,我猜您必须在使用Lombok的类中初始化列表。这可以通过以下方式实现:
Arrays.asList
是使用标准Java库用默认值初始化列表的方法。我知道使用名为Arrays的类而不是List或Collection可能会有点混乱,但您可以找到有关其Javadoc(herejava8的doc)的更多信息。初始化的结果是一个三个整数设置为0的列表。你只需要把你需要的东西放进去在
myList
字段上使用注释@Builder.Default
的原因是让构建器构造函数知道默认初始化,否则Lombok的构建器将跳过该初始化为了简单起见,我只提供了初始化列表和生成器的非常具体的代码。请注意,您可能还希望结合使用Lombok注解@Data和@AllArgsConstructor
你可以找到关于the Lombok official documentation的更多信息