Efficiently converting java string to its equivalent enum

前端 未结 3 1806
离开以前
离开以前 2021-01-26 02:26

Given a string i want to get the enum equivalent of it in constant time. I have a enum defined like the one shown in the question. Best way to create enum of strings?

         


        
相关标签:
3条回答
  • 2021-01-26 03:03

    Since Enum.valueOf operates on the built-in name of the enum (i.e. "STRING_ONE" and "STRING_TWO") you would need to roll your own "registry" of name-to-enum, like this:

    public enum Strings {
        STRING_ONE("ONE"),
        STRING_TWO("TWO")
        ;
        private static final Map<String,Strings> byName = new HashMap<String,Strings>();
        private final String text;
    
        private Strings(final String text) {
            this.text = text;
        }
        static {
            for (Strings s : Strings.values()) {
                byName.put(s.toString(), s);
            }
        }
        @Override
        public String toString() {
            return text;
        }
        public static Strings forName(String name) {
            return byName.get(name);
        }
    }
    

    Demo.

    Above, a map from string name to enum Strings is used to do the translation. If the name is not there, null would be returned from the Strings.forName method.

    0 讨论(0)
  • 2021-01-26 03:18

    I think you need to change the code to be :

    public enum Strings {
            STRING_ONE("ONE"), STRING_TWO("TWO");
    
            private String text;
    
            /**
             * @param text
             */
            private Strings(final String text) {
                this.text = text;
            }
    
            public String getText() {
                return this.text;
            }
    
            public static Strings getByTextValue(String text) {
                for (Strings str : Strings.values()) {
                    if (str.getText().equals(text)) {
                        return str;
                    }
                }
                return null;
            }
    
            /*
             * (non-Javadoc)
             * 
             * @see java.lang.Enum#toString()
             */
            @Override
            public String toString() {
                return text;
            }
        }
    

    Example :

    String test = "ONE";
    Strings testEnum = Strings.getByTextValue(test);
    

    now you have testEnum which is enum reference

    0 讨论(0)
  • 2021-01-26 03:26

    Is Enum.valueOf() not sufficient? How would you imagine being more efficient than that? There's (usually) no need to have an enum STRING_ONE("ONE") - just call enum value ONE and you get .valueOf() lookup for free.

    Otherwise, just create a private static Map<String, YourEnum> and provide a similar valueOf() method that looks up against the Map.

    0 讨论(0)
提交回复
热议问题