使用 @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") 时的性能注意事项的主要内容,如果未能解决你的问题,请参考以下文章

@SuppressWarnings注解

@SuppressWarnings

@SuppressWarnings的参数

java注解 @SuppressWarnings注解用法

@SuppressWarnings忽略警告

Java忽略警告注解@SuppressWarnings