JDK11 升级之 var 语法可读性分析

252 阅读3分钟

我并没有觉得 var 语法增强了可读性,相反我觉得它降低了可读性,因为从代码看不出来是什么具体类型

这是一个非常常见的观点,也是关于 var 关键字在 Java 中引入后争议的核心之一。确实,var 的使用在某些情况下可能会降低代码的可读性,尤其是当变量的类型不明确时。


var 的优缺点

优点

  1. 减少样板代码

    • 在某些情况下,var 可以减少冗长的类型声明,尤其是当类型非常明显或复杂时。

    • 例如:

      Map<String, List<Integer>> map = new HashMap<>();
      // 使用 var
      var map = new HashMap<String, List<Integer>>();
      
  2. 提高开发效率

    • 在快速开发或原型设计中,var 可以减少键入的代码量。
  3. 一致性

    • 在某些情况下,var 可以让代码更简洁和一致,尤其是在链式调用或泛型类型中。

缺点

  1. 降低可读性

    • 如果变量的类型不明显,var 会让代码变得难以理解。例如:

      var result = process(); // result 的类型是什么?
      
    • 需要开发者通过上下文推断类型,增加了阅读代码的负担

  2. 不适合复杂逻辑

    • 在复杂的业务逻辑中,明确的类型声明可以帮助开发者更快地理解代码。
  3. 可能导致误用

    • 如果开发者滥用 var,可能会导致代码风格不一致,甚至引入错误。

何时使用 var

为了平衡可读性和简洁性,以下是一些推荐的使用场景和避免场景:

推荐使用场景

  1. 类型显而易见时

    • 当变量的类型可以从右侧的赋值中清晰推断时,使用 var 是合理的。

    • 例如:

      var list = new ArrayList<String>(); // 类型显而易见
      var stream = Files.lines(Path.of("file.txt")); // 类型清晰
      
  2. 类型冗长或复杂时

    • 当类型声明非常冗长时,var 可以提高代码的简洁性。

      var map = new HashMap<String, List<Integer>>(); // 避免重复声明类型
      
  3. 局部变量

    • 在方法内部的局部变量中使用 var,因为作用域较小,类型容易推断。

避免使用场景

  1. 类型不明确时

    • 如果变量的类型不容易从上下文中推断,避免使用 var

      var result = process(); // 不清楚 process() 返回的是什么类型
      
  2. 基本类型

    • 对于基本类型(如 intdouble 等),使用显式类型通常更清晰。

      int count = 10; // 比 var count = 10; 更直观
      

  3. 公共 API 或接口

    • 在公共方法的返回值或参数中,避免使用 var,因为它会降低代码的可维护性。

示例对比

不推荐的用法

var data = getData(); // getData() 的返回类型不明确
var value = compute(); // compute() 的返回类型需要上下文推断

推荐的用法

var list = new ArrayList<String>(); // 类型显而易见 var stream = Files.lines(Path.of("file.txt")); // 类型清晰

总结

  • var 是一把双刃剑:它可以减少样板代码,但在类型不明确时确实会降低可读性。
  • 最佳实践:在类型显而易见或类型声明非常冗长时使用 var,而在类型不明确或复杂逻辑中避免使用。
  • 团队约定:在团队中使用 var 时,建议制定明确的代码规范,确保一致性和可读性。