Создание предустановленного набора в Java

В Java, как мне создать окончательный набор, который заполняется при построении? Я хочу сделать что-то вроде следующего:

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

но я не знаю правильного синтаксиса в Java.

Ответы

Ответ 1

Попробуйте эту идиому:

import java.util.Arrays;

new HashSet<Integer>(Arrays.asList(1, 2, 3, 6))

Ответ 2

Вы можете использовать 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.

Ответ 3

Самый простой способ, используя стандартные классы 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, которая гарантирует, что ваш постоянный набор действительно постоянный.

Ответ 4

Используя библиотеку 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);

Ответ 5

Вы можете сделать это следующим образом, что ИМО намного лучше и более лаконично, чем другие примеры в этом разделе:

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

после импорта статически вы можете написать что-то вроде этого:

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

Ответ 6

Set<String> s = new HashSet<String>() {{  
  add("1"); add("2"); add("5");  
}};