在Java中实现类似枚举类型的简洁方法

时间:2015-10-28 19:16:02

标签: java enums

我有多种枚举类型,典型的实现如下。

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());
    }
}

除了特定的枚举类型,构造函数和方法(即等于和更多)对于这些枚举是相同的。我不能创建一个超级“类”并从中扩展。有没有一个干净的解决方案,所以我只需要这些方法的一个副本,并使所有枚举类型继承它们?感谢。

2 个答案:

答案 0 :(得分:2)

允许枚举类型实现接口,就像任何其他类一样。 Java SE中的一个示例是StandardCopyOptionLinkOption,它们都实现了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的解决方案)。这样做的问题在于它并没有真正减少样板。