【问题标题】:How can I override toString() Method for all enum classes?如何覆盖所有枚举类的 toString() 方法?
【发布时间】:2015-08-11 15:35:15
【问题描述】:

是否可以为所有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

【问题讨论】:

  • 没有。假设您为两种枚举类型中的所有类覆盖了此方法。应该执行哪个toString 代码?
  • @Pshemo 在该枚举中声明的 toString 方法将在您从该枚举调用该方法时执行。但是如果不可能覆盖所有枚举类,那么在每个枚举类中键入 toString 不是效率低下吗?

标签: java enums tostring


【解决方案1】:

没有。您不能覆盖系统的Enum 类,也不能创建一个子类,您的所有Enums 都继承自a language featurea 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 来做同样的事情:

【讨论】:

  • 你也可以使用WordUtils.capitalizeFully,调用它为return capitalizeFully(inputEnum.name())
  • 你能举例说明如何使用你使用的辅助方法 toEnumString() 吗?
【解决方案2】:

我会创建一个所有枚举 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2012-03-28
    • 2010-09-19
    • 2017-02-11
    • 2021-07-18
    • 2011-08-31
    相关资源
    最近更新 更多