使用Reflection

时间:2017-05-03 20:25:15

标签: java generics enums

在我们的代码中,每当需要创建新的枚举类时,每次都会粘贴10个带有相同模板代码的枚举类。

需要采用通用方法来避免重复此代码。

以下是几个相同的枚举类

类1

 public enum AccountStatus {

ACTIVE("ACTIVE", 1), 
INACTIVE("INACTIVE", 2);

private final int value;

private final String key;

AccountStatus(String key, int value) {
    this.value = value;
    this.key = key;
}

public int getValue() {
    return this.value;
}

public String getKey() {
    return this.key;
}

@Override
public String toString() {
    return String.valueOf(this.value);
}

@JsonCreator
public static AccountStatus create(String key) {
    if (key == null) {
        throw new IllegalArgumentException();
    }
    for (AccountStatus v : values()) {
        if (v.getKey().equalsIgnoreCase(key)) {
            return v;
        }
    }
    throw new IllegalArgumentException();
}

public static AccountStatus fromValue(Integer value) {

    for (AccountStatus type : AccountStatus.values()) {
        if (value == type.getValue()) {
            return type;
        }
    }
    throw new IllegalArgumentException("Invalid enum type supplied");
}

public static AccountStatus fromValue(String key) {

    for (AccountStatus type : AccountStatus.values()) {
        if (type.getKey().equalsIgnoreCase(key)) {
            return type;
        }
    }
    throw new IllegalArgumentException("Invalid enum type supplied");
}
 }

类-2

      public enum Gender {

MALE("MALE", 1), 
FEMALE("FEMALE", 2);

private final int value;

private final String key;

Gender(String key, int value) {
    this.value = value;
    this.key = key;
}

public int getValue() {
    return this.value;
}

public String getKey() {
    return this.key;
}

@Override
public String toString() {
    return String.valueOf(this.value);
}

@JsonCreator
public static Gender create(String key) {
    if (key == null) {
        throw new IllegalArgumentException();
    }
    for (Gender v : values()) {
        if (v.getKey().equalsIgnoreCase(key)) {
            return v;
        }
    }
    throw new IllegalArgumentException();
}

public static Gender fromValue(Integer value) {

    for (Gender type : Gender.values()) {
        if (value == type.getValue()) {
            return type;
        }
    }
    throw new IllegalArgumentException("Invalid enum type supplied");
}

public static Gender fromValue(String gender) {

    for (Gender type : Gender.values()) {
        if (type.getKey().equalsIgnoreCase(gender)) {
            return type;
        }
    }
    throw new IllegalArgumentException("Invalid enum type supplied");
}

}

需要一个处理类中所有方法的通用解决方案。

1 个答案:

答案 0 :(得分:3)

我可以看到两个选项,两个都涉及接口。在任何一种情况下,您仍然需要为枚举创建构造函数并声明字段。

  1. 在您的枚举上为getValuegetKey方法实现一个接口,然后将createfromValue方法移动到一个实用程序类,该类将枚举类作为一个参数。 e.g。
  2. EnumUtility.create(AccountStatus.class, "ACTIVE");

    1. 使用JDK8接口声明将继承到枚举的默认方法实现。