如何为所有枚举类覆盖toString()方法?

4

是否有可能覆盖所有Enum类的toString方法,而不仅在枚举类中覆盖它。例如:

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();
     }
 }

目前,我必须在每个枚举类中覆盖 toString() 方法。我能否创建一个通用的 toString 方法,它将覆盖所有枚举类型的类,而无需在每个枚举类型类中编写 toString 方法?


2
不行。假如您为两个枚举类型中的所有类覆盖了此方法,哪个“toString”代码应该被执行? - Pshemo
@Pshemo 如果在枚举中声明了toString方法,那么当您从该枚举调用该方法时,该方法将被执行。但是,如果无法覆盖所有枚举类,那么在每个枚举类中键入toString是否效率低下? - Baleroc
2个回答

10

不可以覆盖系统的Enum类,也无法创建一个子类,让所有的Enum都继承自它,因为这是一种语言特性,有很多 特殊 规则。但是,你可以创建一个静态的帮助方法:

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

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

  1. You can still override toString() in your enums, but with a lot less chance for copy paste error, and the ability to change it everyone with one code change. e.g.

    enum Coins { PENNY(1), POUND(100), NOTE(500); 
    
      // snip 
      public String toString() {
        return Utils.toEnumString(this);
      }
    }
    
  2. You can use it in other methods, for example:

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

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


您还可以使用WordUtils.capitalizeFully,并将其调用为return capitalizeFully(inputEnum.name()) - yshavit
你能举个例子说明一下你使用的helper方法toEnumString()的用法吗? - Baleroc

1
我会创建一个委托/实用程序/助手,使所有枚举toString()方法调用它。这样可以避免每次想要转换为字符串时都调用实用程序类。
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
}

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