Effective Java - 谨慎地结合泛型和可变参数

2022-06-21  本文已影响0人  DZQANN
  1. 把一个值保存在泛型的可变参数数列中是不安全的
  2. 在Java 7之前, 对泛型可变参数的警告只能在客户端通过@SuppressWarnings("unchecked")来消除,
    Java 7加上了SafeVarargs注解,方法的作者用来承诺安全性
  3. 可以使用SafeVarargs注解标记方法参数安全的情形
    • 没有在可变参数数组中保存任何值
    • 没有对不信任的代码开放该数组
  4. 对于任何带有泛型可变参数或者参数化类型的方法,都要使用SafeVarargs注解
  5. Java8中SafeVarargs注解只能在静态方法和final方法中使用,Java9中可以在私有实例方法上使用
  6. 还有一种选择是使用List代替可变参数

思考

  1. 如果只是读取使用可变参数数组的值,并且不会对方法外暴露这个数组,则可以认为是参数安全的
  2. 使用List代替可变参数固然更好,但是缺陷是调用的时候会更不方便。Java9之后,才有了官方的List.of方法,在此之前可能都要使用Guava。而且感觉test(1, 2, 3)test(List.of(1, 2, 3))看起来更加的优雅
  3. TMS中用到可变参数的地方有很多,大多数不是泛型类。泛型类的地方只有一个方法使用了SafeVarargs注解,这个方法的功能是一个List<Office>数组,拿到第一个不为空的Office,返回Company Code
上一篇下一篇

猜你喜欢

热点阅读