Вы можете использовать отражение. Вот пример:
public String matchMethod(MyEnum myenum, Map<MyEnum, String> enumToFieldMap) throws NoSuchFieldException, IllegalAccessException {
String customFieldName = enumToFieldMap.get(myenum);
if (customFieldName == null) { // custom field name not found, use default mapping
return (String) this.getClass().getDeclaredField(myenum.name().toLowerCase()).get(this);
} // custom field name found in config
return (String) this.getClass().getDeclaredField(customFieldName).get(this);
}
public String matchMethod(MyEnum myEnum) throws NoSuchFieldException, IllegalAccessException {
return matchMethod(myEnum, Collections.EMPTY_MAP);
}
Существуют некоторые недостатки использования отражения, такие как безопасность типов или прослеживаемость, однако в этом случае я думаю, что выбрал бы эту опцию.
Другой , гораздо более гибким вариантом является использование отражения в сочетании с пользовательской аннотацией:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyEnumRef {
MyEnum value();
}
И общий интерфейс:
public interface Pojo {
}
Объявление новых Pojo
(s) становится намного проще и теперь чище и читабельнее Также очень очевидно, где выполняется фактическое сопоставление (конфигурация).
public class MyPojo implements Pojo {
@MyEnumRef(MyEnum.FIELD1)
private String field1;
@MyEnumRef(MyEnum.FIELD2)
private String field2;
@MyEnumRef(MyEnum.FIELD3)
private String field3;
}
public class MyOtherPojo implements Pojo {
@MyEnumRef(MyEnum.FIELD1)
private String field1;
@MyEnumRef(MyEnum.FIELD2)
private String field2;
}
Один простой способ управлять ими всеми:
public String matchMethod(MyEnum myEnum, Pojo myPojo) throws IllegalAccessException {
for (Field field : myPojo.getClass().getDeclaredFields()) {
if (field.isAnnotationPresent(MyEnumRef.class) && field.getAnnotation(MyEnumRef.class).value() == myEnum) {
field.setAccessible(true);
return (String) field.get(myPojo);
}
}
return "";
}
Не имеет значения, какая реализация Pojo
вы используете. Нет никаких накладных расходов при добавлении новых Pojos. Пример:
private void run() throws IllegalAccessException {
System.out.println(">>" + matchMethod(MyEnum.FIELD2, new MyPojo("f1", "f2", "f3")));
System.out.println(">>" + matchMethod(MyEnum.FIELD1, new MyOtherPojo("o1", "o2")));
}