㈠ 不了解这12个语法糖,别说你会java!
阅读本文大概需要 10 分钟。
Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理。
语法糖,也称糖衣语法,由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但让程序员使用更加方便。简而言之,语法糖让程序更加简洁,有更高的可读性。
Java 中最常用的语法糖主要有泛型、变长参数、条件编译、自动拆装箱、内部类等。本文主要来分析下这些语法糖背后的原理。
switch 支持 String 与枚举:从Java 7 开始,Java语言中的语法糖在逐渐丰富,其中一个比较重要的就是Java 7中switch开始支持String。在编译阶段,通过equals()和hashCode()方法实现字符串的switch。
泛型:Java 使用的是Code sharing的处理机制,将多种泛型类形实例映射到唯一的字节码表示上。类型擦除的主要过程是将泛型类的类型参数在编译时擦除,生成普通类和方法。
自动装箱与拆箱:自动装箱和拆箱是自动进行的非人为转换,原始类型值通过调用包装器的valueOf方法进行装箱,通过调用包装器的xxxValue方法进行拆箱。
可变参数:在Java 1.5中引入的特性,允许一个方法把任意数量的值作为参数。可变参数在被使用的时候,首先会创建一个数组,然后再把这个数组作为参数传递到被调用的方法中。
枚举:Java SE5提供了一种新的类型-Java的枚举类型,关键字enum可以将一组具名的值的有限集合创建为一种新的类型。枚举是由final类型的类继承Enum类实现的。
内部类:内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念。编译后,内部类与外部类分别生成两个class文件。
条件编译:Java语法的条件编译,是通过判断条件为常量的if语句实现的。根据if判断条件的真假,编译器直接把分支为false的代码块消除。
断言:在Java中,assert关键字是从JAVA SE 1.4 引入的,用于避免与老版本的Java代码中使用了assert关键字导致的错误。断言的底层实现就是if语句。
数值字面量:在java 7中,数值字面量允许在数字之间插入任意多个下划线,这些下划线不会对字面量的数值产生影响,目的是方便阅读。
for-each:增强for循环背后其实使用了普通的for循环和迭代器。
try-with-resource:从Java 7开始,jdk提供了一种更好的方式关闭资源,使用try-with-resources语句,编译器会帮我们处理关闭资源的操作。
lambda表达式:虽然有人可能认为lambda表达式不是语法糖,其实它也是语法糖的一种,实现方式依赖了JVM底层提供的lambda相关api。
可能遇到的坑:例如当泛型遇到重载、当泛型遇到catch或泛型内包含静态变量时,需要注意避免出现编译错误或潜在的问题。
总结:Java中常用的语法糖让日常开发更加高效,但使用之前了解其原理避免掉坑同样重要。