在Java中,如何创建在构造时填充的最终Set?我想做类似以下的事情:
static final Set<Integer> NECESSARY_PERMISSIONS
= new HashSet<Integer>([1,2,3,6]);
但我不知道Java中的正确语法。
答案 0 :(得分:54)
试试这个成语:
import java.util.Arrays;
new HashSet<Integer>(Arrays.asList(1, 2, 3, 6))
答案 1 :(得分:19)
您可以考虑使用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倍)。
答案 2 :(得分:8)
使用标准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
包装器,它保证你的常量集确实是常量。
答案 3 :(得分:6)
使用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);
答案 4 :(得分:6)
您可以通过以下方式执行此操作: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);
答案 5 :(得分:2)
Set<String> s = new HashSet<String>() {{
add("1"); add("2"); add("5");
}};