我正在尝试使用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;
}
}
答案 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;