Java 更好的设计选择:方法返回对象或传递';类<;T>;类型';作为论据?
在创建行映射器(将行映射到>=1个对象)时,我在对象关系映射过程中遇到了这种情况。我正在玩,您需要实现Java 更好的设计选择:方法返回对象或传递';类<;T>;类型';作为论据?,java,spring,orm,Java,Spring,Orm,在创建行映射器(将行映射到>=1个对象)时,我在对象关系映射过程中遇到了这种情况。我正在玩,您需要实现RowProcessor接口才能拥有“自己的”行映射器。这是方法签名(4种方法中的1种,返回单个对象、列表、映射和数组) 从DBUtil的方法到对象涉及基于反射的实例化和太多的类型转换,甚至无法取出对象 Spring看起来相当简单(相比之下更容易) 问题是设计的灵活性,哪种风格更好,什么时候你会选择基于反射的方法而不是后者(如上所述)?我只是好奇,所以我想我应该把它放出来,让它有一些想法。基本上
RowProcessor
接口才能拥有“自己的”行映射器。这是方法签名(4种方法中的1种,返回单个对象、列表、映射和数组)
从DBUtil的方法到对象涉及基于反射的实例化和太多的类型转换,甚至无法取出对象
Spring看起来相当简单(相比之下更容易)
问题是设计的灵活性,哪种风格更好,什么时候你会选择基于反射的方法而不是后者(如上所述)?我只是好奇,所以我想我应该把它放出来,让它有一些想法。基本上,您认为DBUtils为什么采用基于反射的方法?有什么好处吗?在这种情况下,使用反射(或巨大的开关语句,或任何东西)的好处是将类型unsafety封装在一个地方。呼叫者指定他们要找的是什么,这就是他们得到的。然后,他们可以继续使用它,而无需任何强制转换等。您只需在这一个位置手动检查类型安全性,编译器就会在其他任何地方检查它。返回对象意味着调用方将执行大量强制转换,每个强制转换都可能带有
ClassCastException
,需要手动检查。在这种情况下,使用反射(或巨大的开关语句,或其他什么)有将类型unsafety封装在一个位置的优点。呼叫者指定他们要找的是什么,这就是他们得到的。然后,他们可以继续使用它,而无需任何强制转换等。您只需在这一个位置手动检查类型安全性,编译器就会在其他任何地方检查它。返回对象意味着调用方将执行大量强制转换,每个都可能带有一个ClassCastException
,需要手动检查。另请参见。@trashgood:谢谢链接:)也更合理。@trashgood:谢谢链接:)更合理这是灵活性/易用性与类型安全性的折衷吗?(可能采用了泛型:)反射不会使事情“复杂化”吗?随着时间的推移,您更喜欢(或看到更喜欢)哪种方法?这是灵活性/易用性与类型安全性的折衷吗?(可能采用了泛型:)反射不会使事情“复杂化”吗?随着时间的推移,您更喜欢(或看到更喜欢)哪种方法?
public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException
{
//conversion logic
}
Object mapRow(ResultSet rs, int rowNumber)
{
//conversion logic
}