【问题标题】:Java Enum toString() methodJava 枚举 toString() 方法
【发布时间】:2014-03-31 05:39:03
【问题描述】:

我有几个使用下划线分隔单词的 Java 枚举。在我的每个枚举中,我都有一个 toString 方法,它被实现为 super.toString().replace("_", " ") 以便我可以在没有下划线的情况下在 GUI 上显示字符串值。有什么方法可以让我的所有枚举都使用这个 toString 方法,而不用在所有枚举中复制它?如果这是一个常规类,答案很简单,实现 toString() 然后让我所有需要该实现的类扩展该类,但枚举不能扩展任何东西,甚至不能扩展另一个枚举。

public enum Example1 {
    HELLO_WORLD, HELLO_EARTH, HELLO_GLOBE
    @Override public String toString() {
        return super.toString().replace("_", " ");
    }
}
public enum Example2 {
    ANSWER_1, ANSWER_2, ANSWER_3
    @Override public String toString() {
        return super.toString().replace("_", " ");
    }
}

有没有人有一个不会在所有枚举中复制这个 toString() 方法的解决方案?

【问题讨论】:

  • 在打印枚举时使用辅助方法。
  • 有必要使用“枚举”吗?或者您可以将您的实现更改为类型安全的枚举,以便您可以进行一些继承?
  • @Neel 我明白你的意思,忘记了 Java 枚举并使用 Java 实际识别枚举之前的方法。这是个好主意。
  • 已更新类型安全枚举指南...您可能需要填补空白。

标签: java enums


【解决方案1】:

在 Java 8 中,我们可以使用接口引入方法,因此您现在可以通过继承形式向枚举添加功能。

public interface HasName {
    public String name();
}

public interface PoliteEnum extends HasName {
    default String politeName() {
        return name().replace("_", " ");
    }
}

public enum X implements PoliteEnum {
    A_For_Ism, B_For_Mutton, C_Forth_Highlanders;
}

public void test() {
    for (X x : X.values()) {
        System.out.println(x.politeName());
    }
}

打印

A For Ism
B For Mutton
C Forth Highlanders

我承认它不像覆盖 toString 那样简洁,因为您不能覆盖 default 中的 Object 方法,但它肯定会让您的 enum 保持整洁。

【讨论】:

    【解决方案2】:
    public static String toString(Enum<?> enumVal) {
        return String.valueOf(enumVal).replace("_", " ");
    }
    

    用法:

    String asString = toString(HELLO_WORLD);
    

    或者,

    String asString = toString(ANSWER_1);
    

    类型安全方法:

    public abstract class MyEnum<E extends MyEnum<E>> {
    
        protected MyEnum(String name) {
            this.name = name;
        }
    
        private String name;
    
        protected String name() {
            return name;
        };
    
        @Override
        public final String toString() {
            return name().replace("_", " ");
        }
    }
    
    public final static class Example1 extends MyEnum<Example1> {
        public static final Example1 HELLO_WORLD = new Example1("HELLO_WORLD");
    
        protected Example1(String name) {
            super(name);
        }
    }
    

    用法:

    System.out.println(Example1.HELLO_WORLD);
    

    【讨论】:

      【解决方案3】:

      声明一些辅助方法,例如

      public static <E extends Enum<E>> String toString(Enum<E> value) {
          return value.name().replace("_", ""); // use name() as suggested in comments
      }
      

      只要你想打印enum,就用它

      String valueToPrint = YourHelperClass.toString(Example2.ANSWER_1);
      

      在 Java 8 中,您可以使用具有默认实现的接口,所有枚举都实现(但不要覆盖)。

      【讨论】:

      • 我为什么需要 E?这个辅助方法应该适用于任何枚举,不是吗?
      • @Sotirios 我也有这个想法,但在这种情况下,我和我的团队必须记住使用辅助类(我知道,我知道)。 “答案是:” + enumInstance 的简单性;自动为我调用 toString() 并且已经分散在我的代码中。
      • 您可以在本例中将.toString() 替换为.name(),因为默认情况下,Enum 就是这样做的
      • @Flappjakk 你不需要E,你可以使用通配符(我只是尽量避免使用它们)。 Java 8 即将推出最佳解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 2012-03-28
      • 2013-09-23
      • 1970-01-01
      相关资源
      最近更新 更多