在Java枚举中实现toString方法

69

在Java中似乎可以编写类似于以下代码:

 private enum TrafficLight {
  RED,
  GREEN;

  public String toString() {
   return //what should I return here if I want to return
                               //"abc" when red and "def" when green?
  }
 }

现在,我想知道在枚举值为red时,在toString方法中返回"abc",在它为green时返回"def"是否可能。另外,是否可以像C#那样做到这一点?

 private enum TrafficLight {
  RED = 0,
  GREEN = 15
  ...
 }

我尝试过这个,但是我得到了编译错误。

谢谢


2
请参考 https://dev59.com/hHM_5IYBdhLWcg3wWRkF。 - Mark Elliot
4个回答

121

你可以按照以下方式进行:

private enum TrafficLight {
   // using the constructor defined below
   RED("abc"),
   GREEN("def");

   // Member to hold the name
   private String string;

   // constructor to set the string
   TrafficLight(String name){string = name;}

   // the toString just returns the given name
   @Override
   public String toString() {
       return string;
   }
}

你可以添加任意数量的方法和成员。我相信你甚至可以添加多个构造函数。所有构造函数都必须是private

在Java中,enum基本上是一个具有固定实例数量的class


9
这应该被标记为正确答案。所选解决方案根本不具有可扩展性。 - Erica Kane
1
@EricaKane,哪个不可扩展,是“带有switch的toString”吗?为什么它不可扩展?它编译成了tableswitch JVM指令,这意味着没有在switch情况下进行“循环if” - 相反,情况值用于计算下一个指令偏移量。此外,考虑到枚举通常只包含几个值,可伸缩性很少是一个问题。 - Vsevolod Golovanov
3
“toString with a switch” 方法不具有可扩展性,因为您需要为枚举中的每个成员添加一个 case。另一方面,使用构造函数提出的解决方案更加强大,因为它非常容易显示自定义名称,例如 TrafficLight(String name, int value) {this.value = value; string = name + "(" + value + ")";} - nkatsar
感谢@jjnguy提供的答案和评论。每个枚举都是一个对象,我可以在其中定义构造函数。那个构造函数之后就会发挥魔力!这就是让我绞尽脑汁的地方。 - Vaclav Vlcek

94

答案 1:

enum TrafficLight {
  RED,
  GREEN;

  @Override
  public String toString() {
    switch(this) {
      case RED: return "abc";
      case GREEN: return "def";
      default: throw new IllegalArgumentException();
    }
  }
}

回答2:

enum TrafficLight {
  RED(0),
  GREEN(15);

  int value;
  TrafficLight(int value) { this.value = value; }
}

3
每个实例也可以覆盖toString方法,尽管这会增加类的数量。这可能不太干净,但适用于相关情况。 - Tom Hawtin - tackline

23

如果您需要获得枚举的小写字符串值("red", "green"),可以按以下方式操作:

private enum TrafficLight {
  RED,
  GREEN;

  @Override
  public String toString() {
   return super.toString().toLowerCase();
  }
}

7

我喜欢这种有选择性的toString()方法,如果对某些人有用的话:

private enum TrafficLight {
  RED,
  GREEN {
    @Override
    public String toString() {
        return "GREEN-ISH";
    }
  }
}

2
哦,这个不错。 - devoured elysium

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