在群里讨论技术的时候,经常有群友贴出带 var 字样的代码,我看见它当作没看见一样。
经过前几天的恶补才知道,它不仅是 JavaScript 中的关键字,现在也跑到了 Java 的世界。
虽然并不打算用它,但是还是有必要了解一下,以后再看到它的时候,不要再把它当作 JavaScript。
在 JDK10 版本中,Java引入了一个非常实用的新特性——局部变量类型推断(var)。
什么是局部变量类型推断?为什么使用它?如何使用它?
一、什么是局部变量类型推断(var)?
在Java中,声明一个变量时,通常需要明确指定变量的类型,例如:
String name = "John";
int age = 25;
在这个例子中,String和int是我们为变量name和age指定的类型。这是Java的一大特点,因为它是一门强类型语言,每个变量的类型都需要在编译时确定。
但是,随着代码越来越复杂,尤其是在声明变量时,类型往往是显而易见的。
为了简化代码,JDK 10引入了局部变量类型推断,允许我们用var来代替显式指定类型。var让编译器根据右侧的值自动推断出变量的类型。
二、如何使用 var?
在JDK 10中,使用var可以让编译器自动推断出变量的类型。它的基本语法如下:
var 变量名 = 值;
例如,之前我们可能会写:
String greeting = "Hello, world!";
使用var后,可以简化为:
var greeting = "Hello, world!";
在这个例子中,编译器自动推断出greeting的类型是String,因为"Hello, world!"是一个字符串。
三、var 的使用限制
虽然var提供了很大的便利,但它也有一些限制和规则:
只能用于局部变量
var只能用来声明局部变量,不能用在成员变量、方法参数或返回值等地方。
// 错误:不能用 var 声明成员变量
var name = "Alice"; // 错误,不能在类中使用 var
必须初始化
使用var声明变量时,必须立即初始化变量。因为编译器需要根据右侧的值来推断类型。
var age; // 错误,编译器无法推断类型
不能改变变量类型
var 声明的变量是隐式类型的,声明后不能改变类型。即var声明的变量类型是固定的,不能重新赋值为不同类型。
var x = 10; // 编译器推断 x 的类型是 int
x = "Hello"; // 错误,类型不匹配
四、var 的优点
简化代码
对于一些类型明显的变量,使用var可以减少冗余代码。
例如,声明集合类型时,通常右侧的值已经足够告诉我们类型是什么,使用var可以避免重复书写:
var list = new ArrayList<String>(); // 自动推断为 ArrayList<String>
提高代码可读性
使用var可以使得代码更加简洁,尤其是对于类型名很长的情况。
例如,写Map<String, List<Integer>>时,使用var可以减少重复的部分:
var map = new HashMap<String, List<Integer>>(); // 更简洁
适用于匿名类型
var在处理匿名类或返回值类型不明确的情况下非常有用,避免了显式指定冗长的类型:
var thread = new Thread(() -> System.out.println("Hello!"));
五、var 的缺点
降低类型明确性
使用var时,变量的类型由编译器推断,代码阅读者无法立刻知道变量的类型,这可能会影响代码的可读性,特别是在复杂的表达式中。
因此,var更适合用于类型明显或易于推断的地方。
可能导致错误
如果我们使用var时没有仔细检查右侧的表达式,编译器推断的类型可能与我们期望的不一致,导致一些难以发现的错误。
六、什么时候使用 var?
类型明确的场景
当我们能够清晰知道变量的类型,且右侧的赋值表达式足够清晰时,使用var可以让代码更加简洁。
var price = 19.99; // 自动推断为 double
集合和泛型类型
在处理集合和泛型类型时,var尤其有用,减少了冗长的类型声明。
var list = new ArrayList<String>(); // 自动推断为 ArrayList<String>
匿名类和 lambda 表达式
在处理匿名类或lambda表达式时,var使得代码更简洁。
var thread = new Thread(() -> System.out.println("Hello"));
最后总结
JDK 10的局部变量类型推断(var)是Java语言中的一项非常实用的功能,它可以让代码更加简洁,减少重复的类型声明。
不过,使用时需要小心,避免代码变得难以理解。var适合用于类型明确、赋值清晰的情况,不适合用在复杂或不易推断类型的场景中。
终于明白 var 是啥玩意了,不一定要用它,但一定要知道它是啥。
领取专属 10元无门槛券
私享最新 技术干货