Effective Java - 谨慎地结合泛型和可变参数
2022-06-21 本文已影响0人
DZQANN
- 把一个值保存在泛型的可变参数数列中是不安全的
- 在Java 7之前, 对泛型可变参数的警告只能在客户端通过
@SuppressWarnings("unchecked")
来消除,
Java 7加上了SafeVarargs
注解,方法的作者用来承诺安全性 - 可以使用
SafeVarargs
注解标记方法参数安全的情形- 没有在可变参数数组中保存任何值
- 没有对不信任的代码开放该数组
- 对于任何带有泛型可变参数或者参数化类型的方法,都要使用
SafeVarargs
注解 - Java8中
SafeVarargs
注解只能在静态方法和final
方法中使用,Java9中可以在私有实例方法上使用 - 还有一种选择是使用
List
代替可变参数
思考
- 如果只是读取使用可变参数数组的值,并且不会对方法外暴露这个数组,则可以认为是参数安全的
- 使用
List
代替可变参数固然更好,但是缺陷是调用的时候会更不方便。Java9之后,才有了官方的List.of
方法,在此之前可能都要使用Guava。而且感觉test(1, 2, 3)
比test(List.of(1, 2, 3))
看起来更加的优雅 - TMS中用到可变参数的地方有很多,大多数不是泛型类。泛型类的地方只有一个方法使用了
SafeVarargs
注解,这个方法的功能是一个List<Office>
数组,拿到第一个不为空的Office,返回Company Code