Использование метода из класса enum - PullRequest
1 голос
/ 03 августа 2020

Я новичок ie в JAVA, и у меня проблемы с классами перечисления. У меня есть класс типа enum с именем Answers, который обладает методом, возвращающим константу перечисления Answers:

import java.util.Random;
enum Answers {
    NO,YES;
    Random rand = new Random();
    Answers ask(){
        int prob = (int) (100*rand.nextDouble());
            
        if(prob > 50)
            return Answers.YES;
        else
            return Answers.NO;
    }
}

Тем не менее при попытке распечатать результат с помощью метода я получаю сообщение об ошибке: variable result not might been initialized:

public static void main(String[] args) {
        Answers result;
        switch(result.ask()){
            case NO:
                System.out.println("NO");
                break;
            case YES:
                System.out.println("YES");
                break;   
        }

Ответы [ 4 ]

1 голос
/ 03 августа 2020

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 .

1 голос
/ 03 августа 2020

Эта ошибка сообщает вам, что переменная может быть не инициализирована, вы обрабатываете результат переменной как экземпляр Answers, если вы хотите вернуть экземпляр Answers при вызове метода ask (), вам, вероятно, следует использовать stati c метод, подобный этому.

    static Answers ask(){
        Random rand = new Random();
        int prob = (int) (100*rand.nextDouble());
            
        if(prob > 50)
            return Answers.YES;
        else
            return Answers.NO;
    }

И затем вы можете вызвать этот метод следующим образом.

Answers.ask ()

или

Сохранение в переменной

       public static void main(String[] args) {
        Answers result = Answers.ask();
        switch(result){
            case NO:
                System.out.println("NO");
                break;
            case YES:
                System.out.println("YES");
                break;   
        }
1 голос
/ 03 августа 2020

Вы не инициализировали результат здесь, поэтому имеет смысл, что он не компилируется. Проблема в том, каково значение результата в вашем примере, когда вы вызываете result.ask ()?

Вероятно, вы не хотите назначать результат переменной и можете просто сделать ask () a stati c метод.

1 голос
/ 03 августа 2020

Вам нужно инициализировать результат переменной следующим образом:

Answers result = Answers.YES

Затем вы можете получить доступ к методам объекта

Таким образом, ваш logi c не имеет смысла ставить это в перечислении, вместо этого вы можете иметь перечисление для да или нет и поместить logi c для генерации случайных ответов в методе stati c

enum Answers {
    NO,YES;
    Random rand = new Random();
    static Answers ask(){
        int prob = (int) (100*rand.nextDouble());
            
        if(prob > 50)
            return Answers.YES;
        else
            return Answers.NO;
    }
}

Затем используйте его как следующее

public static void main(String[] args) {
        
        switch(Answers.ask()){
            case NO:
                System.out.println("NO");
                break;
            case YES:
                System.out.println("YES");
                break;   
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...