Java枚举继承:是否可以将枚举的toString()方法提取到一个通用的超类/枚举中?

3

我有4个不同的类,它们都有一个共同的超类叫做 WebService,每个类中都声明了以下枚举(具有不同的值):

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() 方法提取到一个公共的超类/枚举中?目前,我必须为每个枚举复制8次toString()方法...


2
如果你觉得枚举常量应该以小写形式自然显示,那么你可以将它们设为小写,这样就不需要使用toString()方法了。 - Peter Lawrey
2
@Peter Lawrey 我也考虑过这个问题,但这不违反Java编码规范吗?(常量应该大写) - siamii
他们应该这样做,但第一条规则应该是:做你认为最清晰和最简单的事情。 - Peter Lawrey
如果可以的话,你应该将枚举设为私有。这样你就可以省去Java编码规范了。 - emory
3个回答

2

正如其他人所指出的那样,枚举无法继承自一个共同的类。如果你在做更复杂的事情而不是你展示在示例代码中的那样,那么你可以有某种静态助手函数,它接受枚举并进行计算。枚举可以实现一个接口,因此你可以通过这种方式处理复杂的公共toStrings。


我最终在WebService中声明了一个受保护的接口Param,其中包含一个方法toString。所有枚举都实现了这个接口。我还编写了一个静态受保护的toString帮助函数,在WebService中接受一个Param参数。 - siamii
你可能不需要接口,因为所有的对象(甚至枚举)都有一个toString方法 - 所以你只是在进行重写。 - aperkins

1

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


0

由于enum没有可用的继承模型,您无法从enum类中扩展任何内容,因此...


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