更好的设计选择:方法返回 Object 或传递 'Class<T> type' 作为参数?

Posted

技术标签:

【中文标题】更好的设计选择:方法返回 Object 或传递 \'Class<T> type\' 作为参数?【英文标题】:Better design choice: Method returning Object or passing 'Class<T> type' as argument?更好的设计选择:方法返回 Object 或传递 'Class<T> type' 作为参数? 【发布时间】:2011-03-16 18:19:41 【问题描述】:

我在创建行映射器(将一行映射到 >= 1 个对象)时在对象关系映射期间遇到了这种情况。我在玩DBUtils,您需要实现RowProcessor 接口才能拥有“自己的”行映射器。这是方法签名(4 个此类方法中的 1 个,返回单个对象、列表、映射和数组)

public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException 

    //conversion logic

在 Spring 中,这是行映射的方法签名(只有一种方法):

Object mapRow(ResultSet rs, int rowNumber)

//conversion logic

从 DBUtil 的方法到对象涉及基于反射的实例化和过多的类型转换,甚至无法将对象取出。

Spring 似乎相当简单(相比之下更容易)。

那么问题在于设计的灵活性哪种风格更好,你什么时候会选择基于反射的方法而不是后者(如上所述)?我只是好奇,所以我想我会把它放出来以获得一些想法。基本上,您为什么认为 DBUtils 采用了基于反射的方法?有什么优势吗?

【问题讨论】:

另见Class Literals as Runtime-Type Tokens。 @trashgod:感谢您的链接 :) 更有意义 【参考方案1】:

在这种情况下使用反射(或巨大的 switch 语句或其他)具有将类型不安全封装在一个地方的优点。呼叫者指定他们所追求的,这就是他们得到的回报。然后他们可以继续使用它而无需任何强制转换等。您只需要在这个地方手动检查类型安全,编译器将在其他任何地方检查它。返回 Object 意味着调用者将进行大量转换,每个转换都可能带有 ClassCastException 并且需要手动检查。

【讨论】:

这是灵活性/易用性与类型安全性的权衡吗? (可能采用了泛型 :) 反射不会使事情“复杂化”吗?随着时间的推移,您更喜欢(或被认为更喜欢)哪种方法?

以上是关于更好的设计选择:方法返回 Object 或传递 'Class<T> type' 作为参数?的主要内容,如果未能解决你的问题,请参考以下文章

第九章 参数

导航选项卡或部分视图哪个更好?

在返回视图中将 json 作为参数传递

equals() 和 hashCode()

使用 context.Object.SqlQuery 时返回匿名类型

浅析selenium的page object模式