我有两个实现相同界面的枚举
public interface MetaEnum{
String getDefaultValue();
String getKey();
}
public enum A implements MetaEnum{
ONE("1"), TWO("2");
private String val;
A(final v){
val = v;
}
@Override
public String getDefaultValue() {
return value;
}
@Override
public String getKey() {
return (this.getClass().getPackage().getName() + "." + this.getClass().getSimpleName() + "." +
this.toString()).toLowerCase();
}
}
public enum B implements MetaEnum{
UN("1"), DEUX("2");
private String val;
B(final v){
val = v;
}
@Override
public String getDefaultValue() {
return value;
}
@Override
public String getKey() {
return (this.getClass().getPackage().getName() + "." + this.getClass().getSimpleName() + "." +
this.toString()).toLowerCase();
}
...other methods specific to this enum
}
我有重复的代码,我想避免它。有没有办法在某种抽象类中实现getKey?我看了这个问题Java Enum as generic type in Enum,但它不能适应我的需要。
答案 0 :(得分:4)
Java 8中的默认方法可以帮助你:) 此功能允许您在界面内实现方法。
public interface MetaEnum {
String getValue();
default String getKey() {
return (this.getClass().getPackage().getName() + "." +
this.getClass().getSimpleName() + "." +
this.toString()).toLowerCase();
}
}
很遗憾,您无法为getter实现default
方法,因此您仍然会有一些重复的代码。
答案 1 :(得分:4)
将公共代码提取到单独的类:
class MetaEnumHelper {
private String val;
MetaEnumImpl(final v){
val = v;
}
public String getDefaultValue() {
return value;
}
public String getKey(MetaEnum metaEnum) {
return (metaEnum.getClass().getPackage().getName() + "." + metaEnum.getClass().getSimpleName() + "." +
metaEnum.toString()).toLowerCase();
}
}
public enum A implements MetaEnum{
ONE("1"), TWO("2");
private MetaEnumHelper helper;
A(final v){
helper = new MetaEnumHelper(v);
}
@Override
public String getDefaultValue() {
return helper.getDefaultValue();
}
@Override
public String getKey() {
return helper.getKey(this);
}
}
public enum B implements MetaEnum{
UN("1"), DEUX("2");
private MetaEnumHelper helper;
B(final v){
helper = new MetaEnumHelper(v);
}
@Override
public String getDefaultValue() {
return helper.getDefaultValue();
}
@Override
public String getKey() {
return helper.getKey(this);
}
...other methods specific to this enum
}