使用String来评估枚举?

时间:2013-10-15 22:46:17

标签: java eclipse enums constants

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

以下是代码:

    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;
    }

}

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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枚举只是具有私有构造函数和静态定义的实例集的类的特例,因此您应该能够使用枚举执行所需的一切。

您可以在&#34;默认&#34;中使用Month.January,而不是当前的构造函数。 case,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();
        }            
    }
}

答案 2 :(得分:-1)

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

MONTH[] months = MONTH.values();

for (MONTH m : months)
        if (m.toString().equals(nameOfMonth))
            this.monthNumber = MONTH.valueOf(nameOfMonth).ordinal() + 1;