Каков наилучший способ использовать значения, хранящиеся в Enum, как строковые литералы? Например:
public enum Modes {
some-really-long-string,
mode1,
mode2,
mode3
}
Затем позже я мог бы использовать Mode.mode1
чтобы вернуть его строковое представление как mode1
. Без необходимости продолжать вызывать Mode.mode1.toString()
.
Ответ 1
Ты не можешь Я думаю, что у вас есть четыре варианта здесь. Все четыре предлагают решение, но с немного другим подходом...
Вариант первый: использовать встроенное name()
для перечисления. Это прекрасно, если вам не нужен какой-либо специальный формат имен.
String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.
Вариант второй: добавьте переопределенные свойства в свои перечисления, если вы хотите больше контроля
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;
}
}
Вариант третий: использовать статические финалы вместо перечислений:
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() { }
}
Вариант четвертый: интерфейсы имеют каждое поле public, static и final:
public interface Modes {
String MODE_1 = "Fancy Mode 1";
String MODE_2 = "Fancy Mode 2";
String MODE_3 = "Fancy Mode 3";
}
Ответ 2
Каждое перечисление имеет как имя(), так и метод valueOf (String). Первый возвращает имя строки перечисления, а последнее дает значение перечисления, чье имя является строкой. Это похоже на то, что вы ищете?
String name = Modes.mode1.name();
Modes mode = Modes.valueOf(name);
Также есть статическое значение Of (класс, строка) для Enum, поэтому вы также можете использовать
Modes mode = Enum.valueOf(Modes.class, name);
Ответ 3
Вы можете переопределить метод toString()
для каждого значения перечисления.
Пример:
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";
}
}
}
Применение:
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
}
Ответ 4
Как упоминает Бенни Нейгебауэр, вы можете перезаписать toString(). Однако вместо перезаписывания toString для каждого поля перечисления мне больше нравится что-то вроде этого:
public enum Country{
SPAIN("España"),
ITALY("Italia"),
PORTUGAL("Portugal");
private String value;
Country(final String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return this.getValue();
}
}
Вы также можете добавить статический метод для извлечения всех полей, их печати и т.д.
Просто позвоните getValue, чтобы получить строку, связанную с каждым элементом Enum
Ответ 5
mode1.name()
или String.valueOf(mode1)
. Боюсь, что это не лучше.
Ответ 6
public enum Modes {
MODE1("Mode1"),
MODE2("Mode2"),
MODE3("Mode3");
private String value;
public String getValue() {
return value;
}
private Modes(String value) {
this.value = value;
}
}
Вы можете сделать вызов, как показано ниже, где бы вы ни хотели получить значение в виде строки из перечисления.
Modes.MODE1.getvalue();
Это вернет "Mode1" в виде строки.
Ответ 7
Вы можете использовать Mode.mode1.name()
, но вам часто не нужно это делать.
Mode mode =
System.out.println("The mode is "+mode);
Ответ 8
Насколько я знаю, единственный способ получить имя -
Mode.mode1.name();
Если вам это действительно нужно, вы можете сделать это:
public enum Modes {
mode1 ("Mode1"),
mode2 ("Mode2"),
mode3 ("Mode3");
private String name;
private Modes(String s) {
name = s;
}
}
Ответ 9
Вы можете просто использовать:
""+ Modes.mode1
Ответ 10
Для моих перечислений мне не очень нравится думать, что они выделяются по 1 строке. Вот как я реализую метод toString() для перечислений.
enum Animal
{
DOG, CAT, BIRD;
public String toString(){
switch (this) {
case DOG: return "Dog";
case CAT: return "Cat";
case BIRD: return "Bird";
}
return null;
}
}
Ответ 11
Enum - это всего лишь небольшой класс. Enums могут хранить дополнительные поля, внедрять методы и т.д. Например
public enum Modes {
mode1('a'),
mode2('b'),
mode3('c'),
;
char c;
private Modes(char c) {
this.c = c;
}
public char character() {
return c;
}
}
Теперь вы можете сказать:
System.out.println(Modes.mode1.character())
и см. вывод:
a
Ответ 12
package com.common.test;
public enum Days {
monday(1,"Monday"),tuesday(2,"Tuesday"),wednesday(3,"Wednesday"),
thrusday(4,"Thrusday"),friday(5,"Friday"),saturday(6,"Saturday"),sunday(7,"Sunday");
private int id;
private String desc;
Days(int id,String desc){
this.id=id;
this.desc=desc;
}
public static String getDay(int id){
for (Days day : Days.values()) {
if (day.getId() == id) {
return day.getDesc();
}
}
return null;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
};
Ответ 13
мое решение для вашей проблемы!
import java.util.HashMap;
import java.util.Map;
public enum MapEnumSample {
Mustang("One of the fastest cars in the world!"),
Mercedes("One of the most beautiful cars in the world!"),
Ferrari("Ferrari or Mercedes, which one is the best?");
private final String description;
private static Map<String, String> enumMap;
private MapEnumSample(String description) {
this.description = description;
}
public String getEnumValue() {
return description;
}
public static String getEnumKey(String name) {
if (enumMap == null) {
initializeMap();
}
return enumMap.get(name);
}
private static Map<String, String> initializeMap() {
enumMap = new HashMap<String, String>();
for (MapEnumSample access : MapEnumSample.values()) {
enumMap.put(access.getEnumValue(), access.toString());
}
return enumMap;
}
public static void main(String[] args) {
// getting value from Description
System.out.println(MapEnumSample.getEnumKey("One of the fastest cars in the world!"));
// getting value from Constant
System.out.println(MapEnumSample.Mustang.getEnumValue());
System.out.println(MapEnumSample.getEnumKey("One of the most beautiful cars in the world!"));
System.out.println(MapEnumSample.Mercedes.getEnumValue());
// doesnt exist in Enum
System.out.println("Mustang or Mercedes, which one is the best?");
System.out.println(MapEnumSample.getEnumKey("Mustang or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
+ MapEnumSample.getEnumKey("Ferrari or Mustang, which one is the best?") + " is the best!.");
// exists in Enum
System.out.println("Ferrari or Mercedes, wich one is the best?");
System.out.println(MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
+ MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") + " is the best!");
}
}
Ответ 14
Этот метод должен работать с любым enum
:
public enum MyEnum {
VALUE1,
VALUE2,
VALUE3;
public int getValue() {
return this.ordinal();
}
public static DataType forValue(int value) {
return values()[value];
}
public String toString() {
return forValue(getValue()).name();
}
}
Ответ 15
public enum Environment
{
PROD("https://prod.domain.com:1088/"),
SIT("https://sit.domain.com:2019/"),
CIT("https://cit.domain.com:8080/"),
DEV("https://dev.domain.com:21323/");
private String url;
Environment(String envUrl) {
this.url = envUrl;
}
public String getUrl() {
return url;
}
}
String prodUrl = Environment.PROD.getUrl();
Он напечатает:
https://prod.domain.com:1088/
Этот дизайн для перечисляемых строковых констант работает в большинстве случаев.
Ответ 16
после многих попыток я пришел с этим решением
public static enum Operation {
Addition, Subtraction, Multiplication, Division,;
public String getUserFriendlyString() {
if (this==Addition) {
return " + ";
} else if (this==Subtraction) {
return " - ";
} else if (this==Multiplication) {
return " * ";
} else if (this==Division) {
return " / ";
}
return "undefined";
}
}
Ответ 17
Modes.MODE1.toString();
Это простой способ без создания интерфейсов, классов или геттеров.
Ответ 18
Вы можете попробовать это:
public enum Modes {
some-really-long-string,
mode1,
mode2,
mode3;
public String toString(){
switch(this) {
case some-really-long-string:
return "some-really-long-string";
case mode2:
return "mode2";
default: return "undefined";
}
}
}
Ответ 19
я обнаружил, что это легче предотвратить ошибку типа:
public enum Modes {
some-really-long-string,
mode1,
mode2,
mode3;
String str;
Modes(){
this.str = super.name();
}
@Override
@NonNull
public String toString() {
return str;
}
однако - это может работать, когда вам нужно использовать String в журнале /println или всякий раз, когда java компилирует метод toString() автоматически, но в строке кода, подобной этой ->
// sample method that require (string,value)
intent.putExtra(Modes.mode1 ,shareElement.getMode()); // java error
// first argument enum does not return value
вместо этого, как упоминалось выше, вам все равно придется расширять перечисление и использовать .name()
в таких случаях, как это:
intent.putExtra(Modes.mode1.name() ,shareElement.getMode());
Ответ 20
Я удивлен тем, что не те из них, которые рассматривают Enum с атрибутом. Enum будет легко читаемым для программиста, а атрибут может содержать полное имя или "указатель" на перевод. Таким образом, вы можете повторять имена между перечислениями, и у вас нет войн для uniquness строки в атрибуте, поскольку они могут быть очень длинными.
public enum MyEnum
{
[Name("MY_UNIQUE_STRING_FOR_ENUM1")]
Enum1,
[Name("MY_UNIQUE_STRING_FOR_ENUM2")]
Enum2,
[Name("MY_UNIQUE_STRING_FOR_ENUM3")]
Enum3,
}
Использование:
public static string GetEnumName(Enum name)
{
var attribute = name.GetType().GetCustomAttributes(false).FirstOrDefault(o => o is Name);
return attribute.Value;
}
GetEnumName(MyEnum.Enum1);