使用@SuppressWarnings时的性能注意事项(“未选中”)

时间:2018-05-25 14:53:19

标签: java performance warnings query-performance

我希望你很好。

这篇文章是关于在检索数据库信息时使用@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,请你帮我确定一下:

  1. 具有最佳性能考虑因素的一种选择。
  2. 如果@SuppressWarnings(“未选中”)注释具有执行注意事项。
  3. 如果摆脱@SuppressWarnings(“未选中”)是这个范围内的一个好习惯。
  4. 度过愉快的一天。

2 个答案:

答案 0 :(得分:2)

据我所知,@SuppressWarnings注释没有性能影响。它们不会实质性地改变生成的字节码。

源代码中不必要的类型转换应该由字节代码编译器省略,但编译器将包括确保运行时类型安全所需的任何类型转换,而不管抑制警告 1

此外,如果(假设)编译器确实插入了一些非必要的类型转换字节码,那么由JIT编译器进行优化。

但是,最好编写代码,以便不需要使用@SuppressWarnings注释。问题是注释可以隐藏代码中的逻辑错误;警告可能是真实的。如果未通过彻底的单元集成测试检测到,这些可能会导致意外的运行时错误。

1 - 如果编译器没有这样做,那么当由JVM加载时,字节码将无法验证。

答案 1 :(得分:1)

@SuppressWarnings只会影响编译器,只会阻止编译器显示警告。

分配给通用列表时,所有发生的事情都是编译器有机会验证类型的兼容性。在运行时,擦除泛型信息。

情景3是您最好的选择,假设您从代码质量的角度来看您的通话中的列表。所有四种情况都会产生相同的输出。