我希望你很好。
这篇文章是关于在检索数据库信息时使用@SuppressWarnings(“未选中”)时的性能考虑因素。我带来了一个问题,我的公司的线索,它似乎是一个灰色地带。示例如下。
情景1:
public List<BusinessObject> retrieveInformation(Long id){
List<? extends Object> info = persistenceService.get("namedQuery", params, values);
//... cast the contents one by one to List<BusinessObject> and return
}
情景2:
public List<BusinessObject> retrieveInformation(Long id){
List<?> info = persistenceService.get("namedQuery", params, values);
//... cast the contents one by one to List<BusinessObject> and return
}
情景3:
public List<BusinessObject> retrieveInformation(Long id){
List<BusinessObject> info = (List<BusinessObject>)persistenceService.get("namedQuery", params, values);
//... return the List<BusinessObject>
}
情景4:
@SuppressWarnings("unchecked")
public List<BusinessObject> retrieveInformation(Long id){
List<BusinessObject> info = persistenceService.get("namedQuery", params, values);
//... return the List<BusinessObject>
}
当然,还有很多方法可以做到这一点,但我关心的是以最佳性能完成此过程。 因此,我们需要考虑到在检索信息时,我们可能在查询中出错并且会出现异常;另外,如果没有这样的错误,我们已经知道将要检索的对象的类型。
所以,从一个大型商业项目的角度考虑这个问题,所有组件到位,比如hibernate层,DAO和DTO,请你帮我确定一下:
度过愉快的一天。
答案 0 :(得分:2)
据我所知,@SuppressWarnings
注释没有性能影响。它们不会实质性地改变生成的字节码。
源代码中不必要的类型转换应该由字节代码编译器省略,但编译器将包括确保运行时类型安全所需的任何类型转换,而不管抑制警告 1 。
此外,如果(假设)编译器确实插入了一些非必要的类型转换字节码,那么应由JIT编译器进行优化。
但是,最好编写代码,以便不需要使用@SuppressWarnings
注释。问题是注释可以隐藏代码中的逻辑错误;警告可能是真实的。如果未通过彻底的单元和集成测试检测到,这些可能会导致意外的运行时错误。
1 - 如果编译器没有这样做,那么当由JVM加载时,字节码将无法验证。
答案 1 :(得分:1)
@SuppressWarnings只会影响编译器,只会阻止编译器显示警告。
分配给通用列表时,所有发生的事情都是编译器有机会验证类型的兼容性。在运行时,擦除泛型信息。
情景3是您最好的选择,假设您从代码质量的角度来看您的通话中的列表。所有四种情况都会产生相同的输出。