使用字符串计算枚举



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

这是代码:

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

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)
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.JanuaryMonth.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();
        }            
    }
}

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

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

最新更新