我有多种枚举类型,典型的实现如下。
public enum SomeType {
TYPE_A("aaa"),
TYPE_B("bbb"),
private final String type;
private SomeType(String type) { this.type = type; }
public boolean equals(String otherType) {
return (otherType == null) ? false : type.equals(otherType.toUpperCase());
}
}
除了特定的枚举类型,构造函数和方法(即等于和更多)对于这些枚举是相同的。我不能创建一个超级“类”并从中扩展。有没有一个干净的解决方案,所以我只需要这些方法的一个副本,并使所有枚举类型继承它们?感谢。
答案 0 :(得分:2)
允许枚举类型实现接口,就像任何其他类一样。 Java SE中的一个示例是StandardCopyOption和LinkOption,它们都实现了CopyOption。
虽然CopyOption没有任何方法,但如果愿意,你当然可以在这种继承的接口中定义方法。
public interface TypedValue {
String getType();
default boolean equals(String otherType) {
return otherType != null && getType().equals(otherType.toUpperCase());
}
}
public enum SomeType
implements TypedValue {
TYPE_A("aaa"),
TYPE_B("bbb");
private final String type;
private SomeType(String type) { this.type = type; }
@Override
public String getType() {
return type;
}
}
答案 1 :(得分:0)
使用Java 8,您可以执行以下操作:
interface TypeChecker {
default boolean equals(String otherType) {
return otherType != null && otherType.toUpperCase().equals(toString());
}
}
然后你需要
enum SomeType implements TypeChecker {
AAA, BBB
}
这种方法的缺点是枚举常量不能具有与其type
字符串不同的名称。一种解决方法是覆盖单个常量的toString
(或使用除toString
之外的方法,如VGR的解决方案)。这样做的问题在于它并没有真正减少样板。