【问题标题】:Implementing toString on Java enums在 Java 枚举上实现 toString
【发布时间】:2010-03-23 04:10:31
【问题描述】:

在 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?
  }
 }

现在,我想知道当枚举的值为红色时是否可以在 toString 方法中返回“abc”,而当枚举的值为绿色时是否可以返回“def”。另外,是否可以在 C# 中做类似的事情,在哪里可以做到这一点?:

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

我已经尝试过了,但是我遇到了编译器错误。

谢谢

【问题讨论】:

标签: java enums


【解决方案1】:

你可以这样做:

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

【讨论】:

  • 这应该被标记为正确答案。选择的解决方案根本不可扩展。
  • @EricaKane,哪一个是不可扩展的,“toString with a switch”?为什么它不可扩展?它编译为tableswitch JVM 指令,这意味着在switch case 上没有“loop-if”——而是使用case 值来计算下一条指令偏移量。此外,考虑到枚举通常只包含几个值,可伸缩性很少成为问题。
  • @VsevolodGolovanov “toString with a switch”不可扩展,因为您需要为枚举的每个成员添加一个案例。另一方面,使用构造函数的建议解决方案更强大,因为它很容易显示自定义名称,例如TrafficLight(String name, int value) {this.value = value; string = name + "(" + value + ")";}
【解决方案2】:

答案 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; }
}

【讨论】:

  • 也可以在每个实例中覆盖toString,尽管这会增加类的数量。而且可能不是那么干净,但适合相关情况。
【解决方案3】:

另外如果你需要获取枚举的小写字符串值("red", "green") 你可以这样做:

private enum TrafficLight {
  RED,
  GREEN;

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 哦,这个不错。
    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2010-11-12
    • 2014-12-04
    相关资源
    最近更新 更多