在Enum中不是常数

时间:2015-07-07 14:13:38

标签: java enums enumeration

我正在使用带有switch case的枚举,但是我收到以下错误:

  

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函数中创建一个异常,即使传递的值是相同的,所以任何帮助都会受到赞赏,因为我已尽力解决这个问题。

4 个答案:

答案 0 :(得分:8)

将此代码添加到枚举

curl -XPOST 'http://localhost:9200/test/_analyze?analyzer=ja_analyzer&pretty' -d 'ネバーランド福島'
{
  "tokens" : [ {
    "token" : "ネハラント",
    "start_offset" : 0,
    "end_offset" : 6,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "福島",
    "start_offset" : 6,
    "end_offset" : 8,
    "type" : "word",
    "position" : 2
  } ]
}

现在取代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); } 使用valueOf

valueFor

答案 1 :(得分:4)

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

答案 2 :(得分:2)

创建一个这样的方法:

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

并调用此而不是valueOf()。

答案 3 :(得分:0)

您可以更改函数以比较传入的字符串值:

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