如何为所有枚举 类 重写 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();
}
}
这可以通过两种不同的方式使用:
您仍然可以在您的枚举中覆盖 toString()
,但复制粘贴错误的可能性要小得多,并且每个人都可以通过一次代码更改来更改它。例如
enum Coins { PENNY(1), POUND(100), NOTE(500);
// snip
public String toString() {
return Utils.toEnumString(this);
}
}
您可以在其他方法中使用,例如:
System.out.println(Utils.toEnumString(Coins.PENNY));
preparedStatement.setString(1, Utils.toEnumString(Coins.POUND));
你也可以使用 Apache Commons 或 Google Guava 做同样的事情,如果你想在你的项目中添加另一个库:
- Apache Commons:
WordUtils.capitalizeFully
- 番石榴:
CaseFormat.UpperCamel
我会做一个 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
}
是否可以为所有 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();
}
}
这可以通过两种不同的方式使用:
您仍然可以在您的枚举中覆盖
toString()
,但复制粘贴错误的可能性要小得多,并且每个人都可以通过一次代码更改来更改它。例如enum Coins { PENNY(1), POUND(100), NOTE(500); // snip public String toString() { return Utils.toEnumString(this); } }
您可以在其他方法中使用,例如:
System.out.println(Utils.toEnumString(Coins.PENNY)); preparedStatement.setString(1, Utils.toEnumString(Coins.POUND));
你也可以使用 Apache Commons 或 Google Guava 做同样的事情,如果你想在你的项目中添加另一个库:
- Apache Commons:
WordUtils.capitalizeFully
- 番石榴:
CaseFormat.UpperCamel
我会做一个 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
}