我有以下用Java编写的递归方法。该方法在功能上可以正常工作,但是编写得很差。
是否可以应用设计模式或使用反射来实现相同的功能。
任何人都可以审查此方法并提出改进建议。
该方法的功能如下。
IfCondition
对象已使用下面的XML文件填充,以便将某些值(而不是硬编码条件)导出到Java代码中,我们已编写了此XML。
XML Config
<field source="condition" target="transaction.transactionType">
<ifCondition operand="isShortSell" operator="eq" expectedValue="true">
<ifCondition operand="quanity" operator="gt" expectedValue="0" dataType="Double"/>
open
</ifCondition>
</ifCondition>
<ifCondition operand="isShortSell" operator="eq" expectedValue="true">
<ifCondition operand="quanity" operator="lt" expectedValue="0" dataType="Double" />
close
</ifCondition>
</ifCondition>
<ifCondition operand="isShortSell" operator="eq" expectedValue="false">
<ifCondition operand="quanity" operator="gt" expectedValue="0" dataType="Double" />
open
</ifCondition>
</ifCondition>
<ifCondition operand="isShortSell" operator="eq" expectedValue="false">
<ifCondition operand="quanity" operator="lt" expectedValue="0" dataType="Double" />
close
</ifCondition>
</ifCondition>
</field>
Java方法
public static Object deriveConditionalValue(Object txn, IfCondition ifCondition) throws ReflectiveOperationException {
String operand = ifCondition.getOperand();
String operator = ifCondition.getOperator();
String expectedValue = ifCondition.getExpectedValue();
Object conditionalValue = (isExpression(ifCondition.getValue()) ? getExpressionValue(ifCondition.getValue(), txn) : ifCondition.getValue());
String dataType = Optional.ofNullable(ifCondition.getDataType()).orElse(STRING);
Object value = BeanUtils.getProperty(txn, operand);
/*
* Operator, Data type
*/
if (operator.equalsIgnoreCase(EQUAL)) {
if (dataType.equalsIgnoreCase(STRING)) {
String stringValue = String.valueOf(value);
if (stringValue.equalsIgnoreCase(expectedValue)) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(DOUBLE)) {
double doubleValue = Double.parseDouble(String.valueOf(value));
double doubleExpectedValue = Double.parseDouble(expectedValue);
if (doubleValue == doubleExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(LONG)) {
double longValue = Long.parseLong(String.valueOf(value));
double longExpectedValue = Long.parseLong(expectedValue);
if (longValue == longExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
}
} else if (ifCondition.getOperator().equalsIgnoreCase(GREATER_THAN)) {
if (dataType.equalsIgnoreCase(STRING)) {
String stringValue = String.valueOf(value);
if (stringValue.compareToIgnoreCase(expectedValue) > 0) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(DOUBLE)) {
double doubleValue = Double.parseDouble(String.valueOf(value));
double doubleExpectedValue = Double.parseDouble(expectedValue);
if (doubleValue > doubleExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(LONG)) {
double longValue = Long.parseLong(String.valueOf(value));
double longExpectedValue = Long.parseLong(expectedValue);
if (longValue > longExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
}
} else if (ifCondition.getOperator().equalsIgnoreCase(LESS_THAN)) {
if (dataType.equalsIgnoreCase(STRING)) {
String stringValue = String.valueOf(value);
if (stringValue.compareToIgnoreCase(expectedValue) < 0) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(DOUBLE)) {
double doubleValue = Double.parseDouble(String.valueOf(value));
double doubleExpectedValue = Double.parseDouble(expectedValue);
if (doubleValue < doubleExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(LONG)) {
double longValue = Long.parseLong(String.valueOf(value));
double longExpectedValue = Long.parseLong(expectedValue);
if (longValue < longExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
}
} else if (ifCondition.getOperator().equalsIgnoreCase(GREATER_THAN_EQUAL)) {
if (dataType.equalsIgnoreCase(STRING)) {
String stringValue = String.valueOf(value);
if (stringValue.compareToIgnoreCase(expectedValue) >= 0) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(DOUBLE)) {
double doubleValue = Double.parseDouble(String.valueOf(value));
double doubleExpectedValue = Double.parseDouble(expectedValue);
if (doubleValue >= doubleExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(LONG)) {
double longValue = Long.parseLong(String.valueOf(value));
double longExpectedValue = Long.parseLong(expectedValue);
if (longValue >= longExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
}
} else if (ifCondition.getOperator().equalsIgnoreCase(LESS_THAN_EQUAL)) {
if (dataType.equalsIgnoreCase(STRING)) {
String stringValue = String.valueOf(value);
if (stringValue.compareToIgnoreCase(expectedValue) <= 0) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(DOUBLE)) {
double doubleValue = Double.parseDouble(String.valueOf(value));
double doubleExpectedValue = Double.parseDouble(expectedValue);
if (doubleValue <= doubleExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(LONG)) {
double longValue = Long.parseLong(String.valueOf(value));
double longExpectedValue = Long.parseLong(expectedValue);
if (longValue <= longExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
}
} else if (ifCondition.getOperator().equalsIgnoreCase(NOT_EQUAL)) {
if (dataType.equalsIgnoreCase(STRING)) {
String stringValue = String.valueOf(value);
if (!stringValue.equalsIgnoreCase(expectedValue)) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(DOUBLE)) {
double doubleValue = Double.parseDouble(String.valueOf(value));
double doubleExpectedValue = Double.parseDouble(expectedValue);
if (doubleValue != doubleExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
} else if (dataType.equalsIgnoreCase(LONG)) {
double longValue = Long.parseLong(String.valueOf(value));
double longExpectedValue = Long.parseLong(expectedValue);
if (longValue != longExpectedValue) {
if (ifCondition.getIfCondition() == null) {
return conditionalValue;
} else {
return deriveConditionalValue(txn, ifCondition.getIfCondition());
}
} else {
return null;
}
}
}
return null;
}