优化以下代码:if (item.getExpr() instanceof SQLPropertyExpr) { // 不处理 } else if (item.getExpr() instanceof SQLIdentifierExpr) { // 不处理 } else if (item.getExpr() instanceof SQLAllColumnExpr) { String tableName = StringUtil.isBlank(query.getFrom().getAlias()) ? query.getFrom().toString() : query.getFrom().getAlias(); for (MetaColumn tableColumn : getTableColumns(datasourceId, tableName)) { String newColumnName = tableColumn.getColumnName(); if (StringUtil.isNotBlank(newColumnName)) { item.setExpr(new SQLPropertyExpr(new SQLIdentifierExpr(tableName), newColumnName)); } } } else { throw new RuntimeException("Unsupported select item type: " + item.getExpr().getClass().getName()); }
时间: 2024-01-21 22:16:12 浏览: 70
可以使用多态来简化代码,避免大量的 instanceof 判断。具体来说,可以定义一个抽象类 SelectItemHandler,其中包含一个抽象方法 handle,用于处理每个 SelectItem 对象。然后再针对三种不同的 SelectItem 类型分别实现 SelectItemHandler 的子类,分别处理 SQLPropertyExpr、SQLIdentifierExpr 和 SQLAllColumnExpr 类型的 SelectItem。这样代码可以变成以下形式:
```
abstract class SelectItemHandler {
public abstract void handle(SQLSelectItem item);
}
class SQLPropertyExprHandler extends SelectItemHandler {
public void handle(SQLSelectItem item) {
// 不处理
}
}
class SQLIdentifierExprHandler extends SelectItemHandler {
public void handle(SQLSelectItem item) {
// 不处理
}
}
class SQLAllColumnExprHandler extends SelectItemHandler {
public void handle(SQLSelectItem item) {
String tableName = StringUtil.isBlank(query.getFrom().getAlias()) ? query.getFrom().toString() : query.getFrom().getAlias();
for (MetaColumn tableColumn : getTableColumns(datasourceId, tableName)) {
String newColumnName = tableColumn.getColumnName();
if (StringUtil.isNotBlank(newColumnName)) {
item.setExpr(new SQLPropertyExpr(new SQLIdentifierExpr(tableName), newColumnName));
}
}
}
}
public void processSelectItems(List<SQLSelectItem> selectItems) {
for (SQLSelectItem item : selectItems) {
SelectItemHandler handler;
if (item.getExpr() instanceof SQLPropertyExpr) {
handler = new SQLPropertyExprHandler();
} else if (item.getExpr() instanceof SQLIdentifierExpr) {
handler = new SQLIdentifierExprHandler();
} else if (item.getExpr() instanceof SQLAllColumnExpr) {
handler = new SQLAllColumnExprHandler();
} else {
throw new RuntimeException("Unsupported select item type: " + item.getExpr().getClass().getName());
}
handler.handle(item);
}
}
```
这样,每个 SelectItem 对象都会被相应的处理器处理,代码更加简洁和易于扩展。
阅读全文