Scala运行时类实例化设计:非反射方案需求
不用反射实现表名到对应类实例的映射
嘿,这个需求在日常开发里挺常见的,完全不用依赖反射就能优雅解决,给你分享几个实战中常用的方案:
1. 工厂模式 + 预定义映射表
这是最直观也最易维护的方案,核心思路是提前把表名和对应的类构造逻辑绑定到一个映射容器里,用户输入表名后直接从容器里取对应的构造器创建实例。
举个Java的例子(其他面向对象语言逻辑类似):
首先定义所有表处理类的统一接口:
public interface TableHandler { void process(); }
然后实现具体的表处理类:
public class UserTableHandler implements TableHandler { @Override public void process() { System.out.println("处理用户表逻辑"); } } public class OrderTableHandler implements TableHandler { @Override public void process() { System.out.println("处理订单表逻辑"); } }
接下来创建工厂类,用Map存储表名到构造器的映射:
import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; public class TableHandlerFactory { private static final Map<String, Supplier<TableHandler>> HANDLER_MAP = new HashMap<>(); // 静态初始化,提前绑定所有表名和对应的构造逻辑 static { HANDLER_MAP.put("user", UserTableHandler::new); HANDLER_MAP.put("order", OrderTableHandler::new); // 后续新增表只需要在这里加一行即可 } public static TableHandler getHandler(String tableName) { Supplier<TableHandler> supplier = HANDLER_MAP.get(tableName.toLowerCase()); if (supplier == null) { throw new IllegalArgumentException("不支持的表名: " + tableName); // 或者返回一个默认的空实现类,避免抛出异常 } return supplier.get(); } }
最后在命令行逻辑里调用:
public class CliApp { public static void main(String[] args) { String inputTableName = args[0]; // 从命令行获取表名 TableHandler handler = TableHandlerFactory.getHandler(inputTableName); handler.process(); } }
2. 枚举类映射
如果你的表数量不多且相对固定,用枚举来管理映射会更安全,编译期就能检查到错误:
public enum TableEnum { USER("user", UserTableHandler::new), ORDER("order", OrderTableHandler::new); private final String tableName; private final Supplier<TableHandler> handlerSupplier; TableEnum(String tableName, Supplier<TableHandler> handlerSupplier) { this.tableName = tableName; this.handlerSupplier = handlerSupplier; } public static TableHandler getHandler(String tableName) { for (TableEnum enumItem : TableEnum.values()) { if (enumItem.tableName.equalsIgnoreCase(tableName)) { return enumItem.handlerSupplier.get(); } } throw new IllegalArgumentException("不支持的表名: " + tableName); } }
调用的时候就更简单了:
TableHandler handler = TableEnum.getHandler(inputTableName);
注意事项
- 记得做输入校验,把用户输入的表名转成小写/大写,避免大小写敏感的问题
- 如果有新增表的需求,只需要在映射容器(Map或枚举)里新增一行配置,完全符合开闭原则
- 对于表名不存在的情况,建议返回一个默认的空处理类或者明确抛出异常,不要让程序静默失败
内容的提问来源于stack exchange,提问作者Shivakanth Komatreddy
相关产品推荐
相关产品推荐

