Например:
Код: Выделить всё
@Getter
public enum Sample2Enum {
A("a"),
B("b"),
C("c"),
;
private final String str;
Sample2Enum(String str) {
this.str = str;
}
public static boolean isAttributeEquals(String value) {
boolean isAttributeEquals = false;
for (Sample2Enum sample2Enum : Sample2Enum.values()) {
if (sample2Enum.getStr().equals(value)) {
isAttributeEquals = true;
break;
}
}
return isAttributeEquals;
}
}
Поэтому я хочу изучить общий метод, который может оценивать является ли какой-либо параметр атрибутом одного из значений перечисления в классе перечисления.
На мой взгляд, общий метод выглядит следующим образом:
Код: Выделить всё
/**
* Judge whether the given parameter is an attribute of an enum value in the given enum class.
* @param enumClass Target enum class
* @param methodReference The judge method reference
* @param values the parameters need to be checked
* @return true if the parameter is an attribute of an enum value in the given enum class, false otherwise
*/
public static boolean isValidEnumAttribute(Class enumClass, MethodReference methodReference, Object... values) {
T[] enums = enumClass.getEnumConstants();
boolean isEnum = false;
for (T enumValue : enums) {
isEnum = methodReference(values); // call method reference to judge whether the enum value's attribute matches the attribute
if (isEnum) break;
}
return isEnum;
}
Ссылка на метод — это параметр, который я изобразил. По моему мнению, этап оценки должен быть оставлен на усмотрение вызывающей стороны.
Например, я могу определить два метода в Sample2Enum следующим образом:
Код: Выделить всё
public boolean isAttributeEquals2(String value) {
if (this.equals(Sample2Enum.B)) {
return false;
}
return this.getStr().equals(value);
}
public boolean isAttributeEquals3(String value) {
return this.getStr().equals(value);
}
Код: Выделить всё
EnumUtils.isValidEnumAttribute(Sample2Enum.class, Sample2Enum::isAttributeEquals2, "a");
EnumUtils.isValidEnumAttribute(Sample2Enum.class, Sample2Enum::isAttributeEquals3, "b");
Но это не так просто.
Я не знаю, как передать «метод шага оценки» из внешнего источника в isValidEnumAttribute.
Кажется, что единственный простой способ - это то, что вызывающему абоненту необходимо жестко закодировать, чтобы передать «имя метода шага оценки» методу isValidEnumAttribute, и использовать отражение, чтобы получить настоящий «метод шага судьи» в методе isValidEnumAttribute. Это работает следующим образом:
Код: Выделить всё
/**
* Judge whether the given parameter is an attribute of an enum value in the given enum class.
* @param enumClass Target enum class
* @param methodName the name of the method to be called
* @param values the parameters need to be checked
* @return true if the parameter is an attribute of an enum value in the given enum class, false otherwise
*/
public static boolean isValidEnumAttribute(Class enumClass, String methodName, Object... values) throws Exception {
T[] enums = enumClass.getEnumConstants();
Class[] params = new Class[values.length];
for (int i = 0; i < values.length; i++) {
params[i] = values[i].getClass();
}
Method method = enumClass.getMethod(methodName, params);
boolean isEnum = false;
for (T enumValue : enums) {
isEnum = (boolean) method.invoke(enumValue, values);
if (isEnum) break;
}
return isEnum;
}
Код: Выделить всё
System.out.println(EnumUtils.isValidEnumAttribute(Sample2Enum.class, "isAttributeEquals2", "a"));
Я также сомневаюсь, что метод isValidEnumAttribute, который я представлял, приведет к снижению производительности в результате. Но сейчас я просто хочу знать, есть ли способ оправдать мои ожидания или нет.
Подробнее здесь: https://stackoverflow.com/questions/790 ... ne-of-enum
Мобильная версия