Ответ 1
Попробуйте эту идиому:
import java.util.Arrays;
new HashSet<Integer>(Arrays.asList(1, 2, 3, 6))
В Java, как мне создать окончательный набор, который заполняется при построении? Я хочу сделать что-то вроде следующего:
static final Set<Integer> NECESSARY_PERMISSIONS
= new HashSet<Integer>([1,2,3,6]);
но я не знаю правильного синтаксиса в Java.
Попробуйте эту идиому:
import java.util.Arrays;
new HashSet<Integer>(Arrays.asList(1, 2, 3, 6))
Вы можете использовать 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");
Кроме всего прочего, это значительно быстрее (и ~ в 3 раза больше пространства), чем HashSet
.
Самый простой способ, используя стандартные классы 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
, которая гарантирует, что ваш постоянный набор действительно постоянный.
Используя библиотеку 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+ вы можете использовать статические фабричные методы неизменяемого набора:
static final Set<Integer> NECESSARY_PERMISSIONS =
Set.of(1,2,3,6);
Вы можете сделать это следующим образом, что ИМО намного лучше и более лаконично, чем другие примеры в этом разделе:
public static <T> Set<T> set(T... ts) {
return new HashSet<>(Arrays.asList(ts));
}
после импорта статически вы можете написать что-то вроде этого:
public static final Set<Integer> INTS = set(1, 2, 3);
Set<String> s = new HashSet<String>() {{
add("1"); add("2"); add("5");
}};