Выбрать случайное значение из перечисления?

Я обновил ядро ​​jQuery до 1.9.1 и решил разницу интервалов в неактивных вкладках. Сначала я попробую, а затем просмотрю другие варианты переопределения кода.

141
задан Lii 14 August 2018 в 16:42
поделиться

3 ответа

Единственное, что я бы предложил - это кэширование результата значений(), потому что каждый вызов копирует массив. Также не создавайте Случайность каждый раз. Сохраните один. Кроме этого, то, что вы делаете, это нормально. Итак:

public enum Letter {
  A,
  B,
  C,
  //...

  private static final List<Letter> VALUES =
    Collections.unmodifiableList(Arrays.asList(values()));
  private static final int SIZE = VALUES.size();
  private static final Random RANDOM = new Random();

  public static Letter randomLetter()  {
    return VALUES.get(RANDOM.nextInt(SIZE));
  }
}
134
ответ дан 23 November 2019 в 22:23
поделиться

Сочетание предложений cletus и helios,

import java.util.Random;

public class EnumTest {

    private enum Season { WINTER, SPRING, SUMMER, FALL }

    private static final RandomEnum<Season> r =
        new RandomEnum<Season>(Season.class);

    public static void main(String[] args) {
        System.out.println(r.random());
    }

    private static class RandomEnum<E extends Enum<E>> {

        private static final Random RND = new Random();
        private final E[] values;

        public RandomEnum(Class<E> token) {
            values = token.getEnumConstants();
        }

        public E random() {
            return values[RND.nextInt(values.length)];
        }
    }
}

Редактирование: Ой, я забыл параметр ограниченного типа, >.

.
42
ответ дан 23 November 2019 в 22:23
поделиться

Если вы делаете это для тестирования, вы можете использовать Quickcheck ( это Java-порт, над которым я работал).

import static net.java.quickcheck.generator.PrimitiveGeneratorSamples.*;

TimeUnit anyEnumValue = anyEnumValue(TimeUnit.class); //one value

Он поддерживает все примитивные типы, состав типов, коллекции, различные функции распределения, границы и т.д. Он имеет поддержку бегунов, выполняющих несколько значений:

import static net.java.quickcheck.generator.PrimitiveGeneratorsIterables.*;

for(TimeUnit timeUnit : someEnumValues(TimeUnit.class)){
    //..test multiple values
}

Преимущество Quickcheck заключается в том, что вы можете определить тесты, основанные на спецификации, где обычный TDD работает со сценариями.

.
3
ответ дан 23 November 2019 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: