2

我正在尝试使用字符串来评估字符串内容是否等于我声明的枚举类型。但是,我在 Eclipse 中遇到错误,试图强制我将 nameOfMonth 创建为枚举常量。与其编写代码来明确声明一月为#1,二月为#2,等等,我似乎更容易使用枚举。有没有办法可以使用用户定义的字符串并将其与我的枚举进行比较?例如在下面的代码中,如果参数 String nameOfMonth 等于一月,我希望它提取索引位置并添加一个。

这是代码:

    package ProgrammingChallenges;

public class Month
{
    enum MONTH
    {
        January, February, March, April, May, June, July, August, September, October, November, December
    }

    private int monthNumber;

    public Month()
    {
        monthNumber = 1;
    }

    public Month(int monthNumber)
    {
        if (monthNumber < 1 || monthNumber > 12)
            this.monthNumber = 1;
        else
            this.monthNumber = monthNumber;

    }

    public Month(String nameOfMonth)
    {
        if(nameOfMonth.equals(MONTH.nameOfMonth))
            this.monthNumber = namOfMonth.ordinal() + 1;
    }

}
4

3 回答 3

4

Enum.valueOf

您可以使用valueOf枚举的方法。

public Month(String nameOfMonth)
{
   this.monthNumber = MONTH.valueOf(nameOfMonth).ordinal() + 1;
}

这里不需要if语句,直接使用Java内置的valueOf枚举静态方法就可以得到字符串对应的枚举。如果nameOfMonth与枚举不匹配,则会抛出异常:

java.lang.IllegalArgumentException: No enum constant com.yourclass.yourenum.the_invalid_enum_name
    at java.lang.Enum.valueOf(Unknown Source)
于 2013-10-15T22:49:38.573 回答
2
public Month(String nameOfMonth)
{
        this.monthNumber = Enum.valueOf(MONTH, nameOfMonth).ordinal() + 1;
}

根据Enum javadoc,如果用户传递了无效的字符串,这将引发一个IllegalArgumentException错误,这似乎是一个合适的错误。(请注意,MONTH.valueOf(str)只需调用Enum.valueOf(MONTH, str))。

但是,我不明白为什么您甚至需要单独的 Month 课程。你为什么不改成Month一个enum呢?即使您在此类上有额外的方法,您也应该能够像在当前类实现中一样将这些方法添加到枚举中。从技术上讲,Java 枚举只是具有私有构造函数和一组静态定义的实例的类的特殊情况,因此您应该能够使用枚举做任何您想做的事情。

而不是您当前的构造函数,您将Month.January在“默认”情况下使用,Month.values()[i-1]用于您希望通过索引获取月份Month.valueOf(str)的情况以及使用字符串的情况。您还可以将静态辅助方法添加到包含这些案例的枚举中。这是我所描绘的:

public enum Month {
    January, February, March, April, May, June, July, August, September, October, November, December;

    public static Month getDefault() {
        return January;
    }

    public static Month fromNumber(int monthNumber) {
        try {
            return Month.values()[monthNumber-1];
        } catch (ArrayIndexOutOfBoundsException e) {
            return getDefault();
        }
    }

    public static Month fromString(String nameOfMonth) {
        try {
            return valueOf(nameOfMonth);
        } catch (IllegalArgumentException e) {
            return getDefault();
        }            
    }
}
于 2013-10-15T22:51:11.547 回答
-1

对于那些感兴趣的人,这就是我最终解决问题的方式。没有你所有的好答案,我不可能做到!

MONTH[] months = MONTH.values();

for (MONTH m : months)
        if (m.toString().equals(nameOfMonth))
            this.monthNumber = MONTH.valueOf(nameOfMonth).ordinal() + 1;
于 2013-10-16T04:33:24.590 回答