什么是最好的方法来使用存储在Enum字符串字面量的值? 例如:

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

然后我就可以用《风尚》了。将其字符串表示形式返回为Mode1。而不必一直调用Mode.mode1.toString()。


当前回答

据我所知,唯一的办法就是

Mode.mode1.name();

然而,如果你真的需要这样做,你可以这样做:

public enum Modes {
    mode1 ("Mode1"),
    mode2 ("Mode2"),
    mode3 ("Mode3");

    private String name;       

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

其他回答

每个枚举都有一个name()和valueOf(String)方法。前者返回enum的字符串名称,后者给出名称为该字符串的enum值。这就是你要找的吗?

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

Enum本身也有一个静态valueOf(Class, String),所以你也可以使用:

Modes mode = Enum.valueOf(Modes.class, name);

对于我的枚举,我真的不喜欢把它们分配给每个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;
    }
}

我发现这个更容易防止输入错误:

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

    String str;

    Modes(){
        this.str = super.name();
    }

    @Override
    @NonNull
    public String toString() {
        return str;
    }

然而,当你需要在log/println上使用String时,或者当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()); 
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”作为字符串。

你可以试试这个:

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";
        }
    }

}