使用inputString

时间:2018-10-09 20:52:01

标签: java string enums return

我正在学习Java中的Enums,但我的问题在我的代码上无法正常工作。

我用几秒钟和一些名称进行了枚举,后来,我做了一个在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 :(得分:2)

我将遍历您的代码并提出一些意见。然后,我将向您展示您可以进行的一些更改。

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