Я хочу сделать рефакторинг и хочу создать общий класс для избежания дублирования кода. У нас есть много XXXCriteriaValidator в нашем проекте, и мы хотим создать единственный уникальный класс, который заменит их все.Enum static Метод, вызываемый из класса Generic
Проблема заключается в одной строке, где этот класс требует статического метода из Enum. Здесь вы увидите. Это более или менее то, что я хочу достичь:
public class GenericCriteriaValidator<T extends ¿SomeKindOfEnumInterface?>
implements CriterionVisitor {
protected Errors errors;
public Errors getErrors() {
return this.errors;
}
/*
* Some code around here
*/
protected void doVisit(final PropertyCriterion criterion) {
if (criterion == null) {
this.errors.reject("error.criterion.null");
} else {
if (criterion.getOperator() == null) {
this.errors.reject("error.operator.null");
}
// Validates property (exception thrown if not exists)
T.fromString(criterion.getName()); // The problem is this call here!!
// Not saying this compiles, just looking
// how to do something equivalent
}
}
}
T всегда отличается от Enum. Типичное перечисление, как это:
public enum ContactCriteria implements CriteriaInterface<ContactCriteria> {
//^This interface is added by me
// for the enum being called in the previous class
CONTACT_ID("this.id"),
CONTACT_COMPANY_ID("this.companyId"),
CONTACT_NAME("this.name"),
CONTACT_EMAIL("this.email"),
CONTACT_PHONE_NUMBER("this.phoneNumber"),
CONTACT_ORDER("this.order"),
private final String alias;
ContactCriteria(final String alias) {
this.alias = alias;
}
public String getAlias() {
return this.alias;
}
public static ContactCriteria fromString(final String name) {
ContactCriteria result = null;
if (name != null) {
result = Enum.valueOf(ContactCriteria.class, name);
}
return result;
}
public ContactCriteria returnThis() {
return this;
}
}
Наконец, я ищу для создания интерфейса для первого класса, чтобы принять метод fromString Т. Я предполагаю, что это должно быть похоже на:
public interface CriteriaInterface<T> {
static T fromString(String name);
//^This static is important
}
Я не нашел ни одного сообщения или стратегии для создания чего-то подобного с Enum. Я знаю, что Enum может реализовать интерфейс, но не знаю, как его получить.
Пожалуйста, помогите. Заранее спасибо
Я не люблю этот дизайн, но нам предоставили рамки с некоторыми сторонними библиотеками, и мы просто пытаемся улучшить то, что у нас есть. Перечисления уже имеют этот статический метод, поэтому мы можем создать что-то сверху, но есть вещи, которые мы не можем изменить. Я изучаю этот вариант, а также другие. – madtyn