【问题标题】:Creating prepopulated set in Java [duplicate]用Java创建预填充集[重复]
【发布时间】:2012-03-17 05:43:39
【问题描述】:

在 Java 中,如何创建在构造时填充的最终 Set?我想做如下的事情:

static final Set<Integer> NECESSARY_PERMISSIONS 
    = new HashSet<Integer>([1,2,3,6]);

但我不知道 Java 中的正确语法。

【问题讨论】:

  • 我将其命名为重新打开,因为存在细微差别:这专门针对 final 而另一个针对一般范式。例如,包含Collections.unmodifiableSet() 的答案适用于此,但不适用于其他。

标签: java initialization set declaration


【解决方案1】:

使用Google Guava 库,您可以使用ImmutableSet,它正是针对这种情况设计的(常量值):

static final ImmutableSet<Integer> NECESSARY_PERMISSIONS =
        ImmutableSet.of(1,2,3,6);

老式方式(没有任何图书馆):

static final Set<Integer> NECESSARY_PERMISSIONS =
        new HashSet<Integer>(Arrays.asList(1,2,3,6));

编辑:

在 Java 9+ 中,您可以使用 Immutable Set Static Factory Methods

static final Set<Integer> NECESSARY_PERMISSIONS =
        Set.of(1,2,3,6);

【讨论】:

    【解决方案2】:

    您可以通过以下方式执行此操作,IMO 比本主题中的其他示例更好、更简洁:

    public static <T> Set<T> set(T... ts) {
        return new HashSet<>(Arrays.asList(ts));
    }
    

    静态导入后你可以这样写:

    public static final Set<Integer> INTS = set(1, 2, 3);
    

    【讨论】:

      【解决方案3】:

      你可以考虑使用 Guava 的ImmutableSet:

      static final Set<Integer> NECESSARY_PERMISSIONS = ImmutableSet.<Integer>builder()
              .add(1)
              .add(2)
              .add(3)
              .add(6)
              .build();
      static final Set<String> FOO = ImmutableSet.of("foo", "bar", "baz");
      

      除其他外,这比HashSet 快​​得多(并且节省空间约 3 倍)。

      【讨论】:

      • @Louis - 谢谢,我忘记了那个简化的语法。
      【解决方案4】:

      使用标准 Java 类的最简单方法是

      static final Set<Integer> NECESSARY_PERMISSIONS = 
          Collections.unmodifiableSet(new HashSet<Integer>(Arrays.asList(1, 2, 3, 6)));
      

      但您也可以使用静态初始化程序,或委托给私有静态方法:

      static final Set<Integer> NECESSARY_PERMISSIONS = createNecessaryPermissions();
      

      注意unmodifiableSet 包装器,它保证您的常量集确实是常量。

      【讨论】:

        【解决方案5】:
        Set<String> s = new HashSet<String>() {{  
          add("1"); add("2"); add("5");  
        }};
        

        【讨论】:

        【解决方案6】:

        试试这个成语:

        import java.util.Arrays;
        
        new HashSet<Integer>(Arrays.asList(1, 2, 3, 6))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-16
          • 2011-11-20
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 2014-10-05
          • 2011-01-25
          相关资源
          最近更新 更多