如何为所有枚举 类 重写 toString() 方法?

How can I override toString() Method for all enum classes?

是否可以为所有 Enum class 覆盖方法 toString,而不是仅在枚举 class 中覆盖它。示例:

Coins.java:

enum Coins { PENNY(1), POUND(100), NOTE(500); 

    private int value;

    Coins(int coinValue) {
         value = coinValue;
    }
     [...] // Other code

    public String toString() {
         return name().charAt(0) + name().substring(1).toLowerCase();
    }
}

DaysOfWeek.java:

enum DaysOfWeek { MONDAY(1), TUESDAY(2), WEDNESDAY(3);
   
     private int dayID;

     DaysOfWeek(int ID) {
        dayID = ID;
     }
       [...] // Other code

     public String toString() {
         return name().charAt(0) + name().substring(1).toLowerCase();
     }
 }

目前,我必须在每个枚举 class 中覆盖 toString()。我可以创建一个通用的 toString 方法来覆盖所有枚举类型的 class 而无需在每个枚举类型 class 中实际写入 toString 吗?

没有。您不能覆盖系统的 Enum class,也不能创建子class,您的所有 Enum 都继承自 a language feature with a lot of special rules .但是,您可以制作一个静态辅助方法:

public class Utils {
  public static String toEnumString(Enum<?> inputEnum) {
    return inputEnum.name().charAt(0) + inputEnum.name().substring(1).toLowerCase();
  }
}

这可以通过两种不同的方式使用:

  1. 您仍然可以在您的枚举中覆盖 toString(),但复制粘贴错误的可能性要小得多,并且每个人都可以通过一次代码更改来更改它。例如

    enum Coins { PENNY(1), POUND(100), NOTE(500); 
    
      // snip 
      public String toString() {
        return Utils.toEnumString(this);
      }
    }
    
  2. 您可以在其他方法中使用,例如:

    System.out.println(Utils.toEnumString(Coins.PENNY));
    preparedStatement.setString(1, Utils.toEnumString(Coins.POUND));
    

你也可以使用 Apache Commons 或 Google Guava 做同样的事情,如果你想在你的项目中添加另一个库:

我会做一个 delegate/utlity/helper 所有枚举 toString() 方法调用。这避免了在您希望转换为字符串时调用实用程序 class。

private static class CommonEnumToString {
    static String toString(Enum<?> e) {
        return e.name().charAt(0) + e.name().substring(1).toLowerCase();
    }
}

更新 toString() 以调用助手

enum Coins {
    PENNY(1), POUND(100), NOTE(500);
    private int value;
    Coins(int coinValue) {
        value = coinValue;
    }
    public String toString() {
        return CommonEnumToString.toString(this);
    }
}

enum DaysOfWeek {
    MONDAY(1), TUESDAY(2), WEDNESDAY(3);
    private int dayID;
    DaysOfWeek(int ID) {
        dayID = ID;
    }
    public String toString() {
        return CommonEnumToString.toString(this);
    }
}

测试

public static void main(String[] args) {
    System.out.println(DaysOfWeek.WEDNESDAY); // ==> Wednesday
    System.out.println(Coins.PENNY);          // ==> Penny
}