Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Lombok@Builder@Default@Singular初始化列表<&燃气轮机;_Java_Lombok - Fatal编程技术网

Java 使用Lombok@Builder@Default@Singular初始化列表<&燃气轮机;

Java 使用Lombok@Builder@Default@Singular初始化列表<&燃气轮机;,java,lombok,Java,Lombok,免责声明:我对Java有点陌生:) 我在一些数据上运行了一组选择,为了跟踪选择的每个阶段发生了什么,我使用了int计数器。这些计数器都位于数据对象中: public class MyCounters { private int counter0; private int counter1; ... } 我还必须计算在给定数量的类别中有多少候选人,我用enum来解释这些类别。为此,我创建了List,其中列表的索引包含枚举的值 private List<Integer

免责声明:我对Java有点陌生:)

我在一些数据上运行了一组选择,为了跟踪选择的每个阶段发生了什么,我使用了
int
计数器。这些计数器都位于数据对象中:

public class MyCounters {
    private int counter0;
    private int counter1;
    ...
}
我还必须计算在给定数量的类别中有多少候选人,我用
enum
来解释这些类别。为此,我创建了
List
,其中列表的索引包含枚举的值

private List<Integer> myList;
在主代码中,一旦分配了最终类别,就会发生以下情况:

myCounters.getMyList().set(myEnum.ordinal(), myCounters.getList().get(myEnum.ordinal()) + 1);
我被建议使用Lombok的
@Builder.Default
功能(或者可能是
@Singular
)来改进声明/初始化步骤,但我真的不知道该怎么做:最后我需要将
列表
初始化为与
枚举
中的值一样多的零。
使用Lombok的扩展真的可以做到这一点吗?或者它们是针对不同的对象吗?

Lombok的
@Builder
+
@Singular
将使用空的
ArrayList
初始化您的
列表,仅此而已(它们不会使用任何元素(如零)初始化此
列表
)<代码>@Builder.Default
可以做到这一点(您不需要
@Singular
),但如果可能的话,我不会遵循这条路径

我不完全理解您想要做什么,例如,我不知道您是否只有一个
enum
MyEnum
),或者是否有多个
enum

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

  • 是一个简单的选择,因为它是Java的本机:

    • 初始化:
      enummapmymap=newenummap(MyEnum.class)
    • 递增:
      myMap.merge(myEnum,1,Integer::sum)
    • 最终结果:
      myMap.getOrDefault(myEnum,0)
  • 不过,最好的数据结构是一个。一个支持mulitsets的外部库具有以下功能:

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

  • 老实说,我建议采用不同的体系结构:

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

    意思:使用
    地图
    数数东西。检索计数器,调用其
    add()
    方法,完成

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

    @Builder
    public class Foo {
    
      @Builder.Default
      private List<Integer> myList = Arrays.asList(0, 0, 0);
    
    }
    
    @Builder
    公开课Foo{
    @Builder.Default
    私有列表myList=Arrays.asList(0,0,0);
    }
    
    Arrays.asList
    是使用标准Java库用默认值初始化列表的方法。我知道使用名为Arrays的类而不是List或Collection可能会有点混乱,但是您可以找到有关其Javadoc(java8的doc)的更多信息。初始化的结果是一个三个整数设置为0的列表。你只需要放尽可能多的东西

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

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


    你可以在

    上找到更多信息,我不知道是谁给了你这个建议,但听起来像是坏建议。我看不出这有什么关系。你最好让告诉你的人给你举个例子,因为这似乎对你没有帮助。非常感谢@Niccolò这是非常有用的,我想这确实是我试图做的(没有成功)!!我认为元素的数量应该是硬编码的,而不是根据枚举中的元素设置的,所以我将尝试一下我收到的其他一些建议。是的,我已经在使用
    @Data
    和其他注释:)非常感谢!这不是我想要的,但绝对比我想的要好!!我使用了
    EnumMap
    ,效果很好(解决了我试图解决的另一个小问题),非常感谢您的评论!我开始了解Java,每一条信息都很有用!尽管如此,我还是决定使用@TomaszLinkowski建议的
    EnumMap
    @Builder
    public class Foo {
    
      @Builder.Default
      private List<Integer> myList = Arrays.asList(0, 0, 0);
    
    }