如今 Java 9 被遗弃了直接升级到了 Java 10,以前也发过 Java 10 新特性的文章,如今是开始实战 Java 10 的时候了。java
今天要实战的是 Java 10 中最重要的特性:局部变量类型推断,你们都知道是 var
关键字,但具体怎么使用,及要注意什么要点呢?微信
咱们经过几个例子来说解局部变量类型推断这个新特性!oop
var javastack = "javastack"; System.out.println(javastack);
你们看出来了,局部变量类型推断就是左边的类型直接使用 var
定义,而不用写具体的类型,编译器能根据右边的表达式自动推断类型,如上面的 String
。code
var javastack = "javastack";
就等于:教程
String javastack = "javastack";
既然叫局部变量类型推断,以只能用在局部变量中,下面给出更多使用示例。token
一、字面量定义局部变量接口
private static void testVar() { var javastack = "javastack"; System.out.println(javastack); }
二、接收方法返回值定义局部变量get
private static void testMethod() { var javastack = getJavastack(); System.out.println(javastack); } public static String getJavastack() { return "javastack"; }
三、循环中定义局部变量编译器
private static void testLoop() { for (var i = 0; i < 3; i++) { for (var m = 10; m < 15; m++) { System.out.println(i + m); } } }
四、泛型结合局部变量虚拟机
private static void testGeneric() { // 表达式1 List<String> list1 = new ArrayList<>(); list1.add("javastack"); // 表达式2 var list2 = new ArrayList<>(); list2.add(2018); // 表达式3 var list3 = new ArrayList<String>(); list3.add("javastack"); }
表达式1后面 <>
里面 jdk 1.7+开始是不用带具体类型的,在接口中指明就好了。
表达式2中若是使用 var
的话,<>
里面默认会是 Object
的,因此能够添加任意类型。
表达式3中在 <>
强制使用了 String 来指定泛型。
一、类成员变量类型
// 编译报错 private var javastack = "Java技术栈";
二、方法返回类型
/** * 编译报错 * @return */ public static var getJavastack(){ return "Java技术栈"; }
三、Lambda 表达式
private static void testLambda() { Runnable runnable = () -> System.out.println("javastack"); // 编译报错 // var runnable = () -> System.out.println("javastack"); }
以上 3 种场景是确定不能使用 var
的,其余场合有待验证。
优势:简化代码
CopyOnWriteArrayList list1 = new CopyOnWriteArrayList(); ConcurrentModificationException cme1 = new ConcurrentModificationException(); DefaultServiceUnavailableRetryStrategy strategy1 = new DefaultServiceUnavailableRetryStrategy(); var list2 = new CopyOnWriteArrayList<>(); var cme2 = new ConcurrentModificationException(); var strategy2 = new DefaultServiceUnavailableRetryStrategy();
从以上代码能够看出,很长的定义类型会显得代码很冗长,使用 var 大大简化了代码编写,同时类型统一显得代码很对齐。
缺点:掩盖类型
var token = new JsonParserDelegate(parser).currentToken();
看以上代码,不进去看返回结果类型,谁知道返回的类型是什么?因此这种状况最好别使用 var
,而使用具体的抽象类、接口或者实例类型。
var其实就是 Java 10 增长的一种语法糖而已,在编译期间会自动推断实际类型,其编译后的字节码和实际类型一致,如如下例子所示。
private static void testByteCode() { String javastack1 = "javastack"; var javastack2 = "javastack"; }
编译成字节码后:
private static testByteCode()V L0 LINENUMBER 22 L0 LDC "javastack" ASTORE 0 L1 LINENUMBER 23 L1 LDC "javastack" ASTORE 1 L2 LINENUMBER 24 L2 RETURN L3 LOCALVARIABLE javastack1 Ljava/lang/String; L1 L3 0 LOCALVARIABLE javastack2 Ljava/lang/String; L2 L3 1 MAXSTACK = 1 MAXLOCALS = 2
能够看出 javastack1
和 javastack2
都是虚拟机所认识的的本地变量类型:java.lang.String
,虚拟机并不认识 var, 因此 var
并不神奇。
OK,本次 Java 10 局部变量类型推断实战文章就到这里了,后续带来更多的 Java 10 的实战方面的文章。
扫描关注咱们的微信公众号,干货天天更新。