Предполагая, что fieldName
возможные значения соответствуют получателям на bean-компоненте, вы можете использовать Apache BeanUtils:
https://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/PropertyUtils.html#getSimpleProperty - java .lang.Object- java .lang.String-
По сути, вы можете сделать что-то вроде этого:
public String getFieldValue(String fieldName){
return PropertyUtils.getSimpleProperty(fieldName.toLowerCase());
}
Это больше касается улучшения читабельности кода, чем улучшения цикломати c сложности, так что если это чистая производительность, что вы ищете, это не может быть вашим решением.
Если вы ищете чистую производительность, вы можете попробовать использовать лямбды и карту.
import java.util.Map;
import java.util.HashMap;
import java.util.function.Function;
public class HelloWorld{
public static class MyClass {
private static Map<String, Function<MyClass, Object>> descriptor;
static {
descriptor = new HashMap<>();
descriptor.put("id", MyClass::getId);
descriptor.put("name", MyClass::getName);
}
private String id;
private String name;
public String getId() {
return id;
}
public String getName() {
return name;
}
public void setId(String value) {
id = value;
}
public void setName(String value) {
name = value;
}
public Object getFieldValue(String fieldName) {
Function fn = descriptor.get(fieldName);
return fn.apply(this);
}
}
public static void main(String []args){
MyClass mc = new MyClass();
mc.setId("hello");
mc.setName("world");
System.out.println(mc.getFieldValue("id") + " " + mc.getFieldValue("name"));
}
}
Отметим, что в приведенном выше примере сложность cyclomati c все еще присутствует, но она перемещена в инициализатор класса 'stati c. Это означает, что вы будете подвергаться скромному наказанию при запуске приложения, но будете получать более высокую производительность при последующих вызовах getFieldValue
. Кроме того, если вам нужна производительность, вы можете исключить необходимость toLowerCase
... которую я в моем примере удалил.