【问题标题】:not a constant in Enum不是枚举中的常量
【发布时间】:2015-07-07 14:13:37
【问题描述】:

我正在使用带有开关盒的枚举,但我收到以下错误:

NEWS FEED 不是 FragmentName 中的常量

这是我的枚举字符串常量,

 public enum FragmentName{
        FRAGMENT_NEWSFEED("NEWS FEED"),
        FRAGMENT_MESSAGES("MESSAGES"),
        FRAGMENT_EVENTS("EVENTS"),
        FRAGMENT_WHOISAROUDNME("WHOS AROUND");

        private final String text;
        private FragmentName(final String text) {
            this.text = text;
        }
        @Override
        public String toString() {
            return text;
        }
    }

//This is my function from where i check for corresponding enum constant

 public void changeTitle(String title) {
        switch (Enums_String.FragmentName.valueOf(title)) {
            case FRAGMENT_NEWSFEED:
                System.out.println("1");
                break;
            case FRAGMENT_EVENTS:
                System.out.println("2");
                break;
            case FRAGMENT_MESSAGES:
                System.out.println("3");
                break;
            case FRAGMENT_WHOISAROUDNME:
                System.out.println("4");
                break;
        }
    }

当我打电话时

     changeTitle("NEWS FEED");

即使传递的值相同,它也会在 changeTitle 函数中创建一个异常,所以任何帮助都将不胜感激,因为我已尽一切努力解决这个问题。

【问题讨论】:

  • valueOf 调用希望您传入像 FRAGMENT_NEWSFEED 这样的值,而不是字符串值 NEWS FEED
  • 当您使用title"NEWS FEED" 调用Enums_String.FragmentName.valueOf(title) 时,您期望会发生什么以及您认为它应该以这种方式工作的原因(文档的哪一部分建议您这应该像您一样工作)认为是)?
  • 感谢 sstan,但我希望 'NEWS FEED' 发送到 changeTitle(String) 方法和相应的,它必须工作
  • “NEWS FEED”不是枚举的值,而是枚举中文本字段的值。您需要传入一个字符串,它是枚举值的名称,例如“FRAGMENT_NEWSFEED”
  • @Vikram:如果你想使用自己的字符串,那么你不能使用valueOf。将您自己的方法添加到将用户定义的字符串转换为枚举常量的枚举中,然后调用它。

标签: java enums enumeration


【解决方案1】:

将此代码添加到您的枚举中

private static final Map<String, FragmentName> map = new HashMap<>();
static {
    for (FragmentName en : values()) {
        map.put(en.text, en);
    }
}

public static FragmentName valueFor(String name) {
    return map.get(name);
}

现在用valueFor代替valueOf

switch (Enums_String.FragmentName.valueFor(title))
//                                ^^^^^^^^

【讨论】:

    【解决方案2】:

    valueOf

    返回指定枚举类型的枚举常量 指定的名称。该名称必须与用于 在这种类型中声明一个枚举常量。 (多余的空格 不允许使用字符。

    你想要做什么 id 通过一个成员值来获取枚举,因为你已经编写了一个函数来这样做,如下面的fromString

     public enum FragmentName {
    
        FRAGMENT_NEWSFEED("NEWS FEED"),
        FRAGMENT_MESSAGES("MESSAGES"),
        FRAGMENT_EVENTS("EVENTS"),
        FRAGMENT_WHOISAROUDNME("WHOS AROUND");
    
        private final String text;
    
        private FragmentName(final String text) {
            this.text = text;
        }
    
        @Override
        public String toString() {
            return text;
        }
    
        public static FragmentName fromString(String value) {
            for (FragmentName fname : values()) {
                if (fname.text.equals(value)) {
                    return fname;
                }
            }
            return null;
        }
    }
    

    并像

    一样替换您的开关盒
        switch (FragmentName.fromString(title)) {
    

    【讨论】:

      【解决方案3】:

      创建一个这样的方法:

      public static FragmentName getFragmentNameByText(String text) {
          for (FragmentName fragment : values()) {
            if (fragment.text.equals(text)) {
               return fragment;
            }
          }
          return null;
      }
      

      并调用它而不是 valueOf()。

      【讨论】:

        【解决方案4】:

        你可以改变你的函数来比较传入的字符串值:

        public void changeTitle(String title) {
                if(title.equals(FRAGMENT_NEWSFEED.toString())) {
                    System.out.println("1");
                } else if(title.equals(FRAGMENT_MESSAGES.toString())) {
                    System.out.println("2");
                } else if(title.equals(FRAGMENT_EVENTS.toString())) {
                    System.out.println("3");
                } else if(title.equals(FRAGMENT_WHOISAROUDNME.toString())) {
                    System.out.println("4");
                } else {
                    // throw an error
                }
            }
        

        你不能操作关闭函数调用,所以你必须使用 if-else 块。

        【讨论】:

          猜你喜欢
          • 2011-07-09
          • 1970-01-01
          • 2015-08-21
          • 1970-01-01
          • 1970-01-01
          • 2021-11-08
          • 2014-09-26
          • 1970-01-01
          • 2016-11-18
          相关资源
          最近更新 更多