在Java枚举上实现toString

dev*_*ium 46 java enums

在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?
  }
 }
Run Code Online (Sandbox Code Playgroud)

现在,我想知道当枚举值为红色时是否可以返回toString方法"abc",当它为绿色时返回"def".此外,是否可以在C#中执行此操作,您可以在哪里执行此操作?:

 private enum TrafficLight {
  RED = 0,
  GREEN = 15
  ...
 }
Run Code Online (Sandbox Code Playgroud)

我试过这个但是它但是我遇到了编译器错误.

谢谢

jjn*_*guy 95

你可以这样做:

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

您可以根据需要添加任意数量的方法和成员.我相信你甚至可以添加多个构造函数.所有构造函数必须是private.

一个enum在Java中基本上是class有实例的定数.

  • 这应该被标记为正确的答案.所选择的解决方案根本不可扩展. (4认同)
  • @VsevolodGolovanov “toString with a switch”不可扩展,因为您需要为枚举的每个成员添加一个案例。另一方面,使用构造函数的建议解决方案更强大,因为它很容易显示自定义名称,例如`TrafficLight(String name, int value) {this.value = value; 字符串 = 名称 + "(" + 值 + ")";}` (3认同)

mis*_*tor 67

答案1:

enum TrafficLight {
  RED,
  GREEN;

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

答案2:

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

  int value;
  TrafficLight(int value) { this.value = value; }
}
Run Code Online (Sandbox Code Playgroud)

  • 也可以在每个实例中覆盖`toString`,尽管这会增加类的数量.可能不是那么干净,但对相关情况有益. (2认同)

小智 12

此外,如果您需要获取枚举的小写字符串值("红色","绿色"),您可以按如下方式进行:

private enum TrafficLight {
  RED,
  GREEN;

  @Override
  public String toString() {
   return super.toString().toLowerCase();
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

我喜欢这种选择性替代 toString() 的方法,如果它对任何人都有用的话:

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

  • 噢,那是一件好事。 (2认同)