Общий метод определения того, являются ли некоторые параметры атрибутами одного из значений перечисления в классе перечиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Общий метод определения того, являются ли некоторые параметры атрибутами одного из значений перечисления в классе перечи

Сообщение Anonymous »

Когда я разрабатываю проект SpringBoot, мне часто приходится писать код, чтобы определить, являются ли параметры API ожидаемым атрибутом значения перечисления или нет.

Например:

Код: Выделить всё

@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;
}
}
Я думаю, что логика реализации метода 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);
}
И затем я могу вызвать метод isValidEnumAttribute следующим образом (просто в качестве примера, не обращайте внимания на детали):

Код: Выделить всё

EnumUtils.isValidEnumAttribute(Sample2Enum.class, Sample2Enum::isAttributeEquals2, "a");
EnumUtils.isValidEnumAttribute(Sample2Enum.class, Sample2Enum::isAttributeEquals3, "b");
Если эта универсальная функция уже реализована, нам просто нужно определить некоторый «шаг оценки» в классе перечисления, а затем вызвать метод isValidEnumAttribute.

Но это не так просто.

Я не знаю, как передать «метод шага оценки» из внешнего источника в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»