【问题标题】:Java enum elements with spaces?带有空格的Java枚举元素?
【发布时间】:2012-01-13 10:04:33
【问题描述】:

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

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

上面的示例在元素名称中使用空格时出现错误(即北美)。 有什么建议可以解决上述问题吗?

【问题讨论】:

  • 也无法访问该成员;想想myEnum x = myEnum.north America。这些是不可编译的,因为如果允许这样的名称,在哪里设置标识符的结尾?也许应该包含下一个代码行或语句?
  • 不要在枚举甚至类名中使用小写字母!

标签: java enums


【解决方案1】:

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

例如,checkString 是“零用钱”。

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

}

【讨论】:

    【解决方案2】:

    只需在枚举类中创建自己的 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;
          }
    

    【讨论】:

      【解决方案3】:

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

      这样做会结束该标识符,并且解析器假定接下来出现的任何内容都是该语句上下文中的有效标记。合法的地方很少(如果有的话)。

      传统的 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 非常通用,并且只允许单一表示。可能需要多种输出格式,具体取决于toString 不允许的上下文、参数等。

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

      【讨论】:

      • 您可能想要一个与名称不同的名称...(OP 中只有一个元素是一个真实的国家。一个国家、一种语言、一个组成国家和一个大陆。相当多的枚举。)
      • +1 用于提及toString() 的问题。你当然可以添加一个getDisplayName() 方法而不是使用toString()
      • @Jesper 是的,我想是专门针对 getXxx 的东西——我把它放在了非 JavaBeany 上。
      • 哈哈哈!! “和一个大陆”:'D 搞笑。爱语义代码:p
      • @davogotland 从技术上讲,我应该选择 Tom 的 CountryLanguageFederationContinentEtc,但它似乎有点冗长。
      【解决方案4】:

      我要继续猜测您为什么要在名称中使用空格;因为您想将其作为字符串引用。

      这样做:

      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。

      【讨论】:

      • 除非我在发消息,否则此示例在 Java 8 中不起作用; MyEnum.valueOf("North America")MyEnum.valueOf(MyEnum.NORTH_AMERICA.toString()) 都抛出相同的错误:IllegalArgumentException No enum constant ofi.devops.cmwf.model.trigger.MyEnum.North America
      【解决方案5】:

      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)。

      【讨论】:

      • 这是一个语法错误,你可以不按约定编写可编译的代码。
      • 我不是以英语为母语的人,但根据我的理解,它应该被称为约定 :-)
      • public enum myEnum 在这里他没有遵守约定。但north America 是语法错误,无法编译。
      • java手册的上面部分描述了如何根据允许的字符来命名标识符
      • 这是语法(规则),如果您不遵守,您的代码将无法编译。建议遵循约定。 oracle.com/technetwork/java/codeconv-138413.html
      【解决方案6】:

      这个问题与枚举无关(特别是):在 Java 中,名称不能有空格。尝试消除空格(使用大写来区分位)或改用下划线。

      【讨论】:

        【解决方案7】:
        public enum myEnum
        {
            india,
            russian,
            england,
            north_america
        }
        

        访问值

        myEnum.values()
        

        【讨论】:

        • 不要在枚举甚至类名中使用小写字母!
        • @banterCZ 原文
        【解决方案8】:

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

        【讨论】:

        • 感谢 Tudor,但我不想像你说的那样做。需要将这些词分开。
        • @BSalunke 你不能。不过,您可以创建一个带有值的enum。查看更新。
        • 只是为了强调 Dave Newton 所说的:你不能,它就是那样行不通。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-09
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        相关资源
        最近更新 更多