带有空格的Java枚举元素?

时间:2011-12-05 17:16:39

标签: java enums

我正在研究java,我创建了一个枚举如下:

public enum myEnum
{
    india,
    russian,
    england,
    north America
}

上面的示例在元素名称(即北美)中使用空格时会出错。 有关如何解决上述问题的任何建议吗?

8 个答案:

答案 0 :(得分:65)

您不能在标识符的中间放置空格。

这样做结束了标识符和解析器假定下一步是该语句的上下文中的有效标记。很少(如果有的话)是合法的。

传统的Java值名称为:

INDIA,         // Or  India,
RUSSIA,        //     Russia,
NORTH_AMERICA; //     NorthAmerica;

enum可以具有关联的属性,例如人类可读的名称,例如

public enum CountryAndOneContinent {

    INDIA("India"),
    RUSSIA("Russia"),
    NORTH_AMERICA("North America");

    private String displayName;

    CountryAndOneContinent(String displayName) {
        this.displayName = displayName;
    }

    public String displayName() { return displayName; }

    // Optionally and/or additionally, toString.
    @Override public String toString() { return displayName; }
}

我对使用toString提供表示层表示感到矛盾。

我更喜欢方法明确地传达他们的目的 - 它更具表现力和显而易见性。

toString非常通用,只允许单个表示。根据{{​​1}}不允许的上下文,参数等,可能需要多种输出格式。

toString的优点包括在对象上使用默认字符串操作,在这种情况下,使用toString直接从人类可读的版本转换为枚举值。

答案 1 :(得分:15)

我要继续猜猜你为什么要在名字中留一个空格;因为你想把它作为一个字符串引用。

这样做:

public enum MyEnum {
    INDIA("India"),
    RUSSIAN("Russian"),
    ENGLAND("England"),
    NORTH_AMERICA("North America");    

    private String name;

    MyEnum(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }    
}

您可以考虑覆盖字符串。

public toString() {
    return name;
}

重写toString()的一个优点是该字符串也可以在MyEnum .valueOf(myString)中使用。因此,重写toString基本上会创建枚举值的HashMap。

答案 2 :(得分:5)

问题没有(具体)与枚举有关:在Java中,名称不能有空格。尝试消除空间(使用大写来区分比特)或使用下划线。

答案 3 :(得分:3)

将它们一起写为northAmerica或使用下划线north_America

答案 4 :(得分:2)

Java naming rule不允许在变量,类,枚举和枚举成员(以及其他所有标识符)的名称中使用空格作为可能的字符。因此,这个“问题”无法解决。只需使用`north_america'作为会员名称!

  

标识符是Java字母和Java的无限长度序列   数字,第一个必须是Java字母。

     

Java字母包括大写和小写ASCII拉丁字母   A-Z(\ u0041- \ u005a)和a-z(\ u0061- \ u007a),以及历史   原因,ASCII下划线(_,或\ u005f)和美元符号($,或   \ u0024)。 $字符只能用于机械生成   源代码,或者很少访问旧系统上的预先存在的名称。

     

“Java数字”包括ASCII数字0-9(\ u0030- \ u0039)。

答案 5 :(得分:1)

public enum myEnum
{
    india,
    russian,
    england,
    north_america
}

访问值

myEnum.values()

答案 6 :(得分:1)

只需在枚举类中创建自己的valueOf函数。用下划线替换空格。将你的枚举常量命名为" north_america(" North America")"。如果方法无法找到您的枚举,则只返回参数。

public  static String valueOfOrDefault(String myValue) {
//replace space with underscore so it matches enum name
        String value=myValue.toUpperCase().replaceAll("\\s", "_");
        for(myEnum type : myEnum.class.getEnumConstants()) {
          if(type.name().equalsIgnoreCase(value)) {
            return type.toString();
          }
        }
        return myValue;
      }

答案 7 :(得分:0)

我还介绍了一个自己的valueOf方法。但是我使用枚举类型返回,我不必转换" checkString"

checkString是" Petty Cash"例如。

JournalType journalType = JournalType.valueOfOrDefault(checkString);

public enum JournalType {

MISC_BILLING("Misc Billing"),
MISC_BILLING_AUTONUM("Misc Billing AutoNum"),
PRETTY_CASH("Petty Cash"),
RECURRING_AP("Recurring AP"),
GL_JOURNAL("GL Journal"),
GDS_NDS("GDS/NDS");

private final String journalType;

JournalType(String journalType) {
    this.journalType = journalType;
}

@Override
public String toString() {
    return journalType;
}

public static JournalType valueOfOrDefault(String myValue) {
    for(JournalType type : JournalType.class.getEnumConstants()) {
        if(type.toString().equals(myValue)) {
            return type;
        }
    }
   throw new IllegalArgumentException("JournalType not found");
}

}