Метод для получения enumvalue с inputString - PullRequest
0 голосов
/ 09 октября 2018

Я изучаю Enums in Java, и у меня есть вопрос, который плохо работает с моим кодом.

Я сделал Enum с секундами и некоторыми именами, а позже я сделал метод, которыйищет его внутри класса Enum.Идея состоит в том, чтобы запустить счетчик (поэтому я использую целочисленные значения в Enum) с указанием имени операции.

Код:

public enum Calculator {
plus(30), minus(21), divide(21), times(30);
public int seconds;
public int getSeconds() {
    return seconds;
}
Calculator(int seconds) {
    this.seconds = seconds;
}
private String name;
Calculator(String name) {
    this.name = name();
}

  public static Calculator contains(String name) {
    for (Calculator ss : Calculator.values()) {
        if (ss.name.equalsIgnoreCase(name)) {
            System.out.println(name + " input " + ss.name + " enum");
            return ss;
        }
    }
    throw new NullPointerException("Invalid name");
  }
}

И у меня есть еще одинкласс, который вызывает этот метод.Следующий вызывающий объект:

public static void calcInput(String name) {
    try {
        Calculator.contains(name);  
    } catch(NullPointerException e){
        System.out.println("Invalid parameter, " + e );
    }

Дело в том, что при любом вводе, который я использую, правильном или неправильном, он отвечает на исключение NullPointerException.Где я совершаю ошибку?Заранее спасибо!

1 Ответ

0 голосов
/ 10 октября 2018

Я собираюсь пройтись по вашему коду и сделать несколько комментариев.Затем я покажу вам некоторые изменения, которые вы можете сделать.

public enum Calculator {

    // convention is to name enum values as constants: UPPER_CASE_WITH_UNDERSCORES
    plus(30), minus(21), divide(21), times(30);

    // you should not make instance fields public, but private 
    // because they should not be accessed directly by any other class (in general)
    public int seconds;

    // methods, like this 'getter' belong below all constructors
    public int getSeconds() {
        return seconds;
    }

    Calculator(int seconds) {
        this.seconds = seconds;
    }

    private String name;

    // this constructor is never used by your enum values (plus, minus, divide, times)
    // if it were used, the name parameter in the line below this one is never used for anything
    Calculator(String name) {

        // you are trying to set your name field to the name() of the enum value. 
        // even though this would work, this is not very useful 
        // since calling MY_ENUM_VALUE.name() already gives you its name
        this.name = name();
    }

    // a method like 'contains' usually returns a boolean value to indicate if this instance does or does not 
    // contain the parameter you provided. Having a 'contains' method which returns a Calculdator instance is
    // confusing to say the least. A better name (judging from the method implementation) would be 'forName'
    // then you could do:
    // Calculator bla = Calculator.forName("Minus");
    // System.out.println(bla == Calulcator.minus);
    // which would print "true"
    public static Calculator contains(String name) {
        for (Calculator ss : Calculator.values()) {
            if (ss.name.equalsIgnoreCase(name)) {
                System.out.println(name + " input " + ss.name + " enum");
                return ss;
            }
        }
        // Opinions are mixed on whether you should throw NullPointerExceptions from your application code
        // I personally choose to throw IllegalArgumentException in cases like this
        throw new NullPointerException("Invalid name");
    }
}

Вот новая версия кода, которая может делать то, что вы ожидаете.Я не понимаю, как значения «секунд» связаны с операциями калькулятора.

public enum Calculator {

    PLUS(30),
    MINUS(21),
    DIVIDE(21),
    TIMES(30);

    private int seconds;

    Calculator(int seconds) {
        this.seconds = seconds;
    }

    public int getSeconds() {
        return seconds;
    }

    public static Calculator forName(String name) {
        return valueOf(name.toUpperCase());
    }

}

Класс приложения:

public class App {
    public static void main(String[] args) {
        Calculator calculator = Calculator.forName("Minus");
        System.out.println(calculator + " seconds = " + calculator.getSeconds());
    }
}

Вывод:

MINUS seconds = 21
...