免责声明:我对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的扩展确实可以做到这一点吗?还是他们针对其他目标?
答案 0 :(得分:1)
龙目岛的@Builder
+ @Singular
会用空的List
初始化ArrayList
,仅此而已(他们不会初始化此List
与任何元素,例如零)。 @Builder.Default
可以做到这一点(那么您就不需要@Singular
了,但是如果可能的话,我不会遵循该路径。
我不完全了解您想做什么,例如我不知道您是否只有一个enum
(MyEnum
),或者是否有多个enum
。
如果您只有MyEnum
,则使用与List
不同的数据结构会更好:
EnumMap
是简单的选择,因为它是Java固有的:
EnumMap<MyEnum, Integer> myMap = new EnumMap<>(MyEnum.class)
myMap.merge(myEnum, 1, Integer::sum)
myMap.getOrDefault(myEnum, 0)
最合适的数据结构是multiset。一种支持多音集的外部库是Guava及其Multiset
:
Multiset<MyEnum> myMultiset= HashMultiset.create()
myMultiset.add(myEnum)
myMultiset.count(myEnum)
答案 1 :(得分:0)
老实说,我建议使用另一种体系结构:
含义:使用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。
上找到更多信息。