在Java中,我如何在枚举内部获取枚举的值?

8

我想为我的枚举类型Color重写toString()方法。但是,我不知道如何在Color枚举内获取Color实例的值。在Java中是否有这样的方法?

示例:

public enum Color {
    RED,
    GREEN,
    BLUE,
    ...

    public String toString() {
        // return "R" for RED, "G", for GREEN, etc.
    }
}
6个回答

23

你也可以根据this的类型进行切换,例如:

public enum Foo { 
  A, B, C, D 
  ; 
  @Override 
  public String toString() { 
    switch (this) { 
      case A: return "AYE"; 
      case B: return "BEE"; 
      case C: return "SEE"; 
      case D: return "DEE"; 
      default: throw new IllegalStateException(); 
    } 
  } 
} 

这些踩票让我觉得这可能不可能,但对于我想做的事情来说,这是理想的。 - Matthew
3
不,你可以在枚举上进行切换,它可能会被投票反对,因为有更好的方法,我会像Chinmay的解决方案那样做。可惜有人可以在没有评论的情况下进行投票反对。 - vickirk
它编译并且运行正常,不确定为什么会被投票否决。事实上,问题是关于如何获取枚举实例的值,而这个答案进行了描述... - maerics
这个答案与@Andy M的答案非常相似,但他使用了面向对象的多态函数,而你使用了备受厌恶的switch语句。在SO上使用switch语句时必须小心:它会吸引负评。 - Adrian Pronk
我用自己的赞同将其返回到'0'。它回答了确切提出的问题,即使这不是实现元目标的最佳方式。对于其他可能需要获取枚举实例的问题,重要的是记住它只是像任何其他对象一样,并且'this'可以使用。 - PSpeed
点赞!同意,这正是我所寻找的。 - Lonzak

18
public enum Color {
    RED("R"),
    GREEN("G"),
    BLUE("B");

    private final String str;
    private Color(String s){
        str = s;
    }
    @Override
    public String toString() {
        return str;
    }
}

你可以使用 Enum 的构造函数。我没有测试过语法,但这就是思路。


3
我建议添加一个final和几个private修饰符。哦,还有一个分号。 - Tom Hawtin - tackline
如果我的问题很愚蠢,请原谅,但是你的toString方法前面不应该使用"@Override"吗? - Andy M
这不是一个强制要求,@Override只是被Javadoc使用的。它并不是Java语法的一部分。 - Erkan Haspulat
1
@Erkan: @Override不被javadoc使用,javadoc可以判断一个方法是否被覆盖,它是为了编译器而存在的。 - vickirk
1
是的,“@Override”适用于那些无意中拼错方法名或更有可能在某些情况下错误地获取参数类型并且没有真正覆盖您认为的内容的情况。编译器会警告你。 - PSpeed

4

Enum.name() - 你能想到吗?

然而,在大多数情况下,将任何额外的信息保留在构造函数中设置的实例变量中更有意义。


3

使用superString.substring()

public enum Color
{
    RED,
    GREEN,
    BLUE;

    public String toString()
    {
        return "The color is " + super.toString().substring(0, 1);
    }
}

其中,super.toString() 实际上只是调用了 Michael Borgwardt 在他的答案中提到的 name() 方法。 - Tyler

0
Java默认会在toString()中返回.name(),只有当你想要与名称不同的内容时才需要重写toString()方法。有趣的方法是.name()、.ordinal()和.valueOf()。
要做你想要的事情,你可以这样做:
.toString(this.name().substring(1));

你可能想要做的是添加一个名为abbreviation的属性并将其添加到构造函数中,添加一个getAbbreviation()方法并使用它来代替.toString()。

或者更好的做法是,在枚举名称的第一个字符不是应用程序运行语言环境的字符时,从捆绑包中查找要显示的字符串。 - vickirk
将代码本地化和国际化是一个好主意。 - user177800

0
我找到了类似这样的东西(尚未测试):
public enum Color {
RED{
public String toString() {
    return "this is red";
}
},
GREEN{
public String toString() {
    return "this is green";
}
},
...   

}

希望它能有所帮助!


看Erkan H的答案,了解处理这类事情的正确方法。 - Mike Daniels
@Mike:这是个不好的想法有什么特别的原因吗?这似乎是最接近我实际想做的事情 - 我不想在使用此枚举的代码中需要使用构造函数。 - Matthew
在使用枚举的代码中不需要使用构造函数,因为构造函数默认是私有的。顺便说一句,这种做法并不好。 - user177800
如果你真的不想要本地属性并更改构造函数,你可以使用@fuzzy lolipop的解决方案。 - DJ.
这种方法还会使每个常量成为您颜色类型的内部子类,将枚举拆分为N+1个.class文件。可能不是问题,但需要注意。 - ILMTitan
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接