使用 @SuppressWarnings("unchecked") 时的性能注意事项
Posted
技术标签:
【中文标题】使用 @SuppressWarnings("unchecked") 时的性能注意事项【英文标题】:Performance considerations when using @SuppressWarnings("unchecked") 【发布时间】:2018-05-25 14:53:19 【问题描述】:希望你一切都好。
这篇文章是关于在检索数据库信息时使用 @SuppressWarnings("unchecked") 时的性能注意事项。我向我公司的领导提出了一个问题,这似乎是一个灰色地带。示例如下。
场景 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>
当然,还有很多方法可以做到这一点,但我关心的是一种以最佳性能执行此过程的方法。 所以,我们需要考虑到,在检索信息的时候,我们可能会在查询中出现错误,并且会出现异常;另外,如果没有这样的错误,我们确实已经知道要检索的对象的类型。
所以,从一个大型商业项目的角度考虑这个问题,所有组件都已到位,比如休眠层、DAO 和 DTO,请您帮我确定:
-
具有最佳性能考虑的选项。
如果@SuppressWarnings("unchecked") 注释有性能考虑。
如果在此范围内摆脱 @SuppressWarnings("unchecked") 是一种很好的做法。
祝你有美好的一天。
【问题讨论】:
由于类型擦除,这些在运行时都没有任何影响。 注解在编译时。 再问一个问题,这种情况下的警告会被认为是代码异味吗?摆脱它会更好吗? 【参考方案1】:据我所知,@SuppressWarnings
注释对性能没有影响。它们不会实质性地改变生成的字节码。
字节码编译器应省略源代码中不必要的类型转换,但编译器将包含确保运行时类型安全所必需的任何类型转换,而不管警告是否禁止1 .
此外,如果(假设)编译器确实插入了一些并非绝对必要的类型转换字节码,则它们应该被 JIT 编译器优化掉。
但是,最好编写您的代码,这样您就不需要使用@SuppressWarnings
注释。问题是注释可以隐藏代码中的逻辑错误;即警告可以是真实的。如果没有被彻底的单元和集成测试检测到,这些可能会导致意外的运行时错误。
1 - 如果编译器不这样做,那么字节码在被 JVM 加载时将无法验证。
【讨论】:
【参考方案2】:@SuppressWarnings 仅影响编译器,并且仅用于阻止编译器显示警告。
当分配给泛型列表时,所发生的只是编译器有机会验证类型的兼容性。在运行时,泛型信息被删除。
场景 3 是您最好的选择,假设您从代码质量的角度获得了一个列表。所有四个场景都会产生相同的输出。
【讨论】:
以上是关于使用 @SuppressWarnings("unchecked") 时的性能注意事项的主要内容,如果未能解决你的问题,请参考以下文章