【问题标题】:Java enum inheritance: Is it possible to somehow extract the enums' toString() method to a common super class/enum?Java 枚举继承:是否有可能以某种方式将枚举的 toString() 方法提取到一个通用的超类/枚举中?
【发布时间】:2011-07-29 15:09:07
【问题描述】:

我有 4 个不同的类,其中有一个名为 WebService 的通用 superlass,每个类都声明了以下枚举(具有不同的值):

public class GeoPlacesService extends WebService {

public enum RequestParam {
    LOCATION, RADIUS, SENSOR, KEY;

    @Override
    public String toString() {
       return super.toString().toLowerCase();
    }
}

public enum ResponseParam {
    STATUS, LATITUDE, LONGITUDE, NAME;

    @Override
    public String toString() {
       return super.toString().toLowerCase();
    }
}
}

是否有可能以某种方式将枚举的 toString() 方法提取到一个通用的超类/枚举中?现在,我必须为每个枚举复制 toString() 8 次...

【问题讨论】:

  • 如果您认为枚举常量应该自然显示,您可以将它们设为小写,那么您的 toString() 就不需要了。
  • @Peter Lawrey 我正在考虑这个问题,但这不违反 java 编码约定吗? (常量应为大写)
  • 他们应该,但第一条规则应该是;做你认为最清晰、最简单的事情。
  • 如果可以,您应该将您的枚举设为私有。然后你就可以省去java编码约定了。

标签: java inheritance enums


【解决方案1】:

正如其他人所指出的,您不能让枚举继承自一个公共类。如果您正在做的事情比您在示例代码中显示的更复杂,那么您可以拥有某种静态的辅助函数,该函数在某个地方接收枚举并进行计算。枚举可以实现一个接口,因此您可以通过这种方式处理复杂的通用 toStrings。

【讨论】:

  • 我最终在WebServie 中声明了一个名为Param 的受保护接口,它有一个方法toString。这是由所有枚举实现的。我还在 WebService 中编写了一个静态受保护的 toString 辅助函数,它采用 Param
  • 你可能不需要接口,因为所有对象(甚至枚举)都有一个 toString 方法 - 所以你只是在做一个覆盖。
【解决方案2】:

枚举是最终的,也不能从任何东西继承,所以不。您可以做的最好的事情是覆盖 toString() 并委托给一个通用的“to-stringer”实现,这样您就不必一遍又一遍地编写实际的实现。

【讨论】:

    【解决方案3】:

    因为enum 没有可供您使用的继承模型,所以您无法从enum 类中扩展任何内容,因此......

    【讨论】:

      猜你喜欢
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      相关资源
      最近更新 更多