原返回Connection的接口改为返回Object是否欠妥?求优化建议
接口返回值改为Object的缺陷与优化建议
这种设计的核心缺陷
- 完全丢失类型安全:调用方拿到
Object后必须做强制类型转换,一旦类型不匹配就会抛出ClassCastException,而且这个问题只能在运行时暴露,编译期根本查不出来,排查bug要花更多时间。 - 代码可读性极差:其他开发者看到这个方法返回
Object时,完全没法一眼知道它可能返回哪些类型,必须翻实现逻辑或者查文档,后续改代码很容易踩坑。 - 没法利用多态简化逻辑:原本
Connection有统一的方法规范,改成Object后,调用方得先写一堆instanceof判断类型,再调用对应方法,代码会变得臃肿又混乱。 - IDE辅助功能失效:编辑器没法给
Object类型提供代码补全、类型检查这些便利,写代码的效率会低很多。
优化实现方案
方案1:抽象统一接口或父类
定义一个通用的数据库连接接口,让JDBC的Connection和MongoDB的MongoDatabase通过封装类来实现这个接口,方法返回这个统一接口:
// 通用接口,定义所有数据库连接都需要的方法 public interface DatabaseConnection { void close(); // 统一的关闭连接方法 // 可以根据业务需求加其他通用方法,比如获取数据库名称等 } // 封装JDBC Connection的实现类 public class JdbcDbConnection implements DatabaseConnection { private Connection rawConn; public JdbcDbConnection(Connection conn) { this.rawConn = conn; } // 提供获取原始Connection的方法,方便特定操作 public Connection getRawConnection() { return rawConn; } @Override public void close() { try { rawConn.close(); } catch (SQLException e) { // 处理关闭异常 } } } // 封装MongoDatabase的实现类 public class MongoDbConnection implements DatabaseConnection { private MongoDatabase rawDb; public MongoDbConnection(MongoDatabase db) { this.rawDb = db; } public MongoDatabase getRawDatabase() { return rawDb; } @Override public void close() { // 实现Mongo连接的关闭逻辑,比如关闭MongoClient } } // 修改后的方法 DatabaseConnection getConnection(String uri);
调用方可以先通过统一接口做通用操作,需要特定类型的原生对象时,再通过getRawConnection()或getRawDatabase()获取,既保证类型安全,又保留灵活性。
方案2:使用泛型方法
如果调用方在调用时就明确知道要获取的类型,可以用泛型来约束返回值:
<T> T getConnection(String uri, Class<T> targetType);
实现的时候,根据uri判断要返回的类型,再校验是否和targetType匹配,不匹配就抛出异常。调用的时候像这样:
// 获取JDBC连接 Connection jdbcConn = getConnection("jdbc:xxx:xxx", Connection.class); // 获取MongoDB数据库对象 MongoDatabase mongoDb = getConnection("mongodb://xxx:xxx", MongoDatabase.class);
这种方式能在编译期就保证类型正确,也明确了调用方的预期,避免类型转换错误。
方案3:直接拆分方法
如果两种连接的使用场景完全分离,最省心的方式就是拆成两个独立的方法:
Connection getJdbcConnection(String jdbcUri); MongoDatabase getMongoDbConnection(String mongoUri);
这完全符合单一职责原则,调用方不用猜返回类型,代码一目了然,后续维护也最简单。
内容的提问来源于stack exchange,提问作者Fabricio Franco
相关产品推荐
相关产品推荐

