在我们的代码中,每当需要创建新的枚举类时,每次都会粘贴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");
}
}
需要一个处理类中所有方法的通用解决方案。
答案 0 :(得分:3)
我可以看到两个选项,两个都涉及接口。在任何一种情况下,您仍然需要为枚举创建构造函数并声明字段。
getValue
和getKey
方法实现一个接口,然后将create
和fromValue
方法移动到一个实用程序类,该类将枚举类作为一个参数。 e.g。 EnumUtility.create(AccountStatus.class, "ACTIVE");