Java 10中var的优缺点、适用场景及使用原则探讨
Java中var的使用场景、原则及注意事项
你说得没错,var在Java里确实不是关键字,而是保留类型名称——这也是为什么你代码里var var = 5;是合法的原因,它可以作为变量名使用,但真心不建议这么做,可读性太差了,谁看谁懵。
一、适合用var的场景
- 初始化时类型一目了然的局部变量:就像你代码里的
var x = new HashMap<>();、var y = new HashMap<String, Integer>();、var z = "soner";,右边的表达式已经把变量类型写得明明白白,用var能去掉重复的类型声明,让代码更简洁清爽。比如不用写HashMap<String, Integer> y = new HashMap<>();,这种重复的写法完全是冗余的。 - 遍历集合/数组的增强for循环:比如
for (var item : userList),不用特意写User或者泛型类型,代码更简洁,而且类型也很明确。 - 方法内的临时中间变量:比如计算过程中临时存结果的变量,类型很清晰,用
var能让代码更聚焦于业务逻辑,而不是纠结类型声明。
二、必须避免用var的场景
- 变量初始值为null:就像你代码里的
var umm = null;,编译器根本没法推断出具体类型,直接报错,这种情况绝对不能用。 - 未初始化的变量:
var foo;这种写法也是错误的,var完全依赖初始化值来推断类型,没有初始值编译器就不知道该给它分配什么类型。 - 方法参数、返回值或类成员变量:
var只能用于局部变量(方法内、代码块内的变量),这是Java语法硬规定,别在方法参数、返回值或者类的成员变量上瞎用。 - 类型模糊的表达式:如果右边的表达式类型不明确(比如调用一个返回
Object的方法),用var会让其他开发者花额外时间去猜类型,这时候不如直接写明确的类型。 - 需要强调类型的业务场景:比如金额用
BigDecimal而不是double,这种类型是业务逻辑的关键,明确写出类型能让其他开发者一眼注意到这个类型的重要性,这时候就别用var。
三、使用var的核心原则
- 可读性永远是第一位:这是最核心的原则,
var的目的是简化代码,而不是制造困惑。如果用了var之后,其他开发者需要翻半天代码才能搞清楚变量类型,那不如不用。 - 只在局部变量里用:牢牢记住
var的适用范围只有局部变量,别在其他地方瞎尝试。 - 初始化值必须明确:给
var声明的变量一个清晰的初始化值,让编译器能准确推断类型,避免编译错误。
附上你提供的代码,我给加了更详细的注释:
import java.util.HashMap; public class Test { public static void main(String[] args) { var x = new HashMap<>(); // 合法:编译器推断为HashMap<Object, Object> var y = new HashMap<String, Integer>(); // 合法:推断为HashMap<String, Integer> var z = "soner"; // 合法:推断为String类型 System.out.println(z); var umm = null; // 错误:null没有具体类型,编译器无法推断 // var foo; // 错误:未初始化,编译器没法确定变量类型 // var var = 5; // 合法:var是保留类型名称而非关键字,可作为变量名,但极度不推荐 } }
内容的提问来源于stack exchange,提问作者Soner from The Ottoman Empire




