Usar valores de enumeración como literales de cadena

Resuelto Larry asked hace 13 años • 19 respuestas

¿Cuál es la mejor manera de utilizar los valores almacenados en una enumeración como literales de cadena? Por ejemplo:

public enum Modes {
    some-really-long-string,
    mode1,
    mode2,
    mode3
}

Luego podría usar Mode.mode1para devolver su representación de cadena como mode1. Sin tener que seguir llamando Mode.mode1.toString().

Larry avatar Jul 12 '11 22:07 Larry
Aceptado

No puedes. Creo que tienes CUATRO opciones aquí. Los cuatro ofrecen una solución pero con un enfoque ligeramente diferente...

Opción uno: usar el integrado name()en una enumeración. Esto está perfectamente bien si no necesita ningún formato de nombre especial.

    String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.

Opción dos: agregue propiedades primordiales a sus enumeraciones si desea tener más control

public enum Modes {
    mode1 ("Fancy Mode 1"),
    mode2 ("Fancy Mode 2"),
    mode3 ("Fancy Mode 3");

    private final String name;       

    private Modes(String s) {
        name = s;
    }

    public boolean equalsName(String otherName) {
        // (otherName == null) check is not needed because name.equals(null) returns false 
        return name.equals(otherName);
    }

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

Opción tres: usar finales estáticos en lugar de enumeraciones:

public final class Modes {

    public static final String MODE_1 = "Fancy Mode 1";
    public static final String MODE_2 = "Fancy Mode 2";
    public static final String MODE_3 = "Fancy Mode 3";

    private Modes() { }
}

Opción cuatro: las interfaces tienen todos los campos públicos, estáticos y finales:

public interface Modes {

    String MODE_1 = "Fancy Mode 1";
    String MODE_2 = "Fancy Mode 2";
    String MODE_3 = "Fancy Mode 3";  
}
Michael J. Lee avatar Jul 12 '2011 16:07 Michael J. Lee

Cada enumeración tiene un método name()y un valueOf(String)método. El primero devuelve el nombre de la cadena de la enumeración y el segundo proporciona el valor de la enumeración cuyo nombre es la cadena. ¿Es esto lo que estás buscando?

String name = Modes.mode1.name();
Modes mode = Modes.valueOf(name);

También hay una estática valueOf(Class, String)en Enumsí misma, por lo que también puedes usar:

Modes mode = Enum.valueOf(Modes.class, name);
Ryan Stewart avatar Jul 12 '2011 16:07 Ryan Stewart

Puede anular el toString()método para cada valor de enumeración.

Ejemplo:

public enum Country {

  DE {
    @Override
    public String toString() {
      return "Germany";
    }
  },
  IT {
    @Override
    public String toString() {
      return "Italy";
    }
  },
  US {
    @Override
    public String toString() {
      return "United States";
    }
  }

}

Uso:

public static void main(String[] args) {
  System.out.println(Country.DE); // Germany
  System.out.println(Country.IT); // Italy
  System.out.println(Country.US); // United States
}
Benny Code avatar Aug 29 '2014 19:08 Benny Code