tl; dr
static Answer random() { return ThreadLocalRandom.current().nextBoolean() ? YES : NO ; }
static
Имейте в виду, что NO
и YES
являются экземплярами вашего класса Answer
. (Кстати, перечисление лучше называть в единственном числе.) Таким образом, вместо обычного метода экземпляра ваш метод ask
должен быть static
.
На самом деле, я бы не стал помещать ваш метод ask
внутри вашего перечисления. Перечисление предоставляет значения и данные, но обычно не должно знать, как оно используется, например, случайным образом. Но я не буду на этом останавливаться.
ThreadLocalRandom
Что касается класса Random
, я рекомендую использовать вместо него ThreadLocalRandom
. Это делает код безопасным для потоков. Возможно, вам не нужна безопасность хлеба, но у использования ThreadLocalRandom
нет недостатков. Еще одно преимущество ThreadLocalRandom
- это повторный запуск нового объекта Random
. Лучше всего то, что ThreadLocalRandom
имеет удобные методы, такие как nextBoolean
, без каких-либо вычислений, которые вы выполняли.
Вызов ThreadLocalRandom.current()
, чтобы установить генератор случайных значений для этого потока . Если еще не установлен, запускается генератор.
В вашей ситуации требуется только диапазон из двух значений, чтобы выбрать между вашими значениями NO
и YES
. Поэтому вызовите ThreadLocalRandom.current().nextBoolean()
, чтобы сгенерировать значение true
или false
.
Тернарный оператор
Вместо оператора if
эта ситуация является хорошим местом для троичный оператор . Компактный синтаксис троичной системы работает следующим образом:
someTestEvaluatingToTrueOrFalse ? thisValueReturnedIfTrue : thisValueReturnedIfFalse
Кстати, я изменил имя вашего метода с ask
на random
, чтобы лучше передать, что он на самом деле делает.
Пример кода
Собирая все вместе, мы получаем следующий код.
enum Answer
{
NO , YES ;
static Answer random()
{
return ThreadLocalRandom.current().nextBoolean() ? YES : NO ;
}
}
Использование:
Answer answer = Answer.random() ;
См. Этот код, запущенный в режиме реального времени на IdeOne. com .