Java 中的语法糖 (Syntactic Sugar)
语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语。指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会;但是这种语法对语言的功能并没有影响。
Java中的泛型,变长参数,自动拆箱/装箱,条件编译等都是,下面做简单的介绍和分析。
泛型
与C#中的泛型相比,Java的泛型可以算是“伪泛型”了。在C#中,不论是在程序源码中、在编译后的中间语言,还是在运行期泛型都是真实存在的。Java则不同,Java的泛型只在源代码存在,只供编辑器检查使用,编译后的字节码文件已擦除了泛型类型,同时在必要的地方插入了强制转型的代码。
泛型代码:
public static void main(String[] args) { List<String> stringList = new ArrayList<String>(); stringList.add("oliver"); System.out.println(stringList.get(0));
}
将上面的代码的字节码反编译后:
public static void main(String args[])
{ List stringList = new ArrayList(); stringList.add("oliver"); System.out.println((String)stringList.get(0));
}
自动拆箱/装箱
自动拆箱/装箱是在编译期,依据代码的语法,决定是否进行拆箱和装箱动作。
装箱过程:把基本类型用它们对应的包装类型进行包装,使基本类型具有对象特征。
拆箱过程:与装箱过程相反,把包装类型转换成基本类型。
需要注意的是:包装类型的“==”运算在没有遇到算数运算符的情况下不会自动拆箱,而其包装类型的equals()方法不会处理数据类型转换,所以:
Integer a = 1;
Integer b = 1;
Long c = 1L;
System.out.println(a == b);
System.out.println(c.equals(a));
这样的代码应该尽量避免自动拆箱与装箱。
循环历遍(foreach)
语法:
List<Integer> list = new ArrayList<Integer>();
for(Integer num : list){ System.out.println(num);
}
Foreach要求被历遍的对象要实现Iterable接口,由此可想而知,foreach迭代也是调用底层的迭代器实现的。反编译上面源码的字节码:
List list = new ArrayList();
Integer num;
Integer num;
for (Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(num)){ num = (Integer) iterator.next();
}
条件编辑
很多编程语言都提供了条件编译的途径,C,C++中使用#ifdef。Java语言并没有提供这种预编译功能,但是Java也能实现预编译。
if(true){ System.out.println("oliver");
}else{ System.out.println("lee");
}
这段代码的字节码反编译后只有一条语句:
System.out.println("oliver");
在编译器中,将会把分支不成立的代码消除,这一动作发生在编译器解除语法糖阶段。 所以说,可以利用条件语句来实现预编译。
枚举
枚举类型其实并不复杂,在JVM字节码文件结构中,并没有“枚举”这个类型。
其实源程序的枚举类型,会在编译期被编译成一个普通了类。利用继承和反射,这是完全可以做到的。
看下面一个枚举类:
public enum EnumTest { OLIVER,LEE;
}
反编译字节码后:
public final class EnumTest extends Enum { private EnumTest(String s, int i) { super(s, i); } public static EnumTest[] values() { EnumTest aenumtest[]; int i; EnumTest aenumtest1[]; System.arraycopy(aenumtest = ENUM$VALUES, 0, aenumtest1 = new EnumTest[i = aenumtest.length], 0, i); return aenumtest1; } public static EnumTest valueOf(String s) { return (EnumTest) Enum.valueOf(EnumTest, s); } public static final EnumTest OLIVER; public static final EnumTest LEE; private static final EnumTest ENUM$VALUES[]; static { OLIVER = new EnumTest("OLIVER", 0); LEE = new EnumTest("LEE", 1); ENUM$VALUES = (new EnumTest[] { OLIVER, LEE }); }
}
至于更多细节,可以参考父类Enum。
变长参数
变长参数允许我们传入到方法的参数是不固定个数。
对于这个方法:
public void foo(String str,Object...args){
}
我们可以这样调用:
foo("oliver");
foo("oliver",new Object());
foo("oliver",new Integer(1),"sss");
foo("oliver",new ArrayList(),new Object(),true,1);
参数args可以是任意多个。 其实,在编译阶段,args是会被编译成Object [] args。
public transient void foo(String s, Object aobj[])
{
}
这样,变长参数就可以实现了。
但是要注意的是,变长参数必须是方法参数的最后一项。
除了上面介绍的语法糖,还有内部类,断言以及JDK7的switch支持字符串,自动关闭资源(在try中定义和关闭)等。
感兴趣的同学可以反编译字节码了解它们的本质。
无疑,语法糖方便了程序员的开发,提高了开发效率,提升了语法的严谨也减少了编码出错误的几率。我们不仅仅在平时的编码中依赖语法糖,更要看清语法糖背后程序代码的真实结构,这样才能更好的利用它们。
Java 中的语法糖 (Syntactic Sugar)相关推荐
- 浅析java中的语法糖
概述 编译器是一种计算机程序, 它主要的目的是将便于人编写.阅读.维护的高级计算机语言所写的源代码程序, 翻译为计算机能解读.运行的低阶机器语言的程序, 即可执行文件.而 javac 就是java语言 ...
- python语法糖是什么_Python语法糖Syntactic Sugar
语法糖(Syntactic sugar): 计算机语言中特殊的某种语法 这种语法对语言的功能并没有影响 对于程序员有更好的易用性 能够增加程序的可读性 简而言之,语法糖就是程序语言中提供[奇技淫巧]的 ...
- C# 语法糖(Syntactic sugar)
定义 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能 ...
- Java 中的语法糖,真甜。
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 我们在日常开发中经常会使用到诸如泛型.自动拆箱和装箱.内部 ...
- Java中的语法糖及反编译工具
雪压枝头低,虽低不着泥 壹·Java中的反编译工具 贰·常见的12"颗"语法糖 switch forEach lambda if条件编译 变长参数 enum assert断言 tr ...
- 语法糖 Syntactic sugar: 复杂代码的等价简洁替代
语法糖(Syntactic sugar) 在不改变代码所在位置.语法结构的前提下,实现了运行时的等价代码更简洁流畅,代码更语义自然,可读性高 写着爽,看着爽,就像吃了糖,效率高,错误少 例: 最基本的 ...
- JavaScript中的 语法糖 是什么?
专业的解释 在计算机科学中,语法糖(syntactic sugar)是指编程语言中可以更容易的表达一个操作的语法,它可以使程序员更加容易去使用这门语言:操作可以变得更加清晰.方便,或者更加符合程序员的 ...
- 阿里云面试:什么是语法糖?Java中有哪些语法糖?
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...
- 什么是语法糖?Java中有哪些语法糖?
本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理 1 语法糖 语 ...
最新文章
- Eclipse生成jar文件
- 您所知道的IT运维管理
- Python3 多线程问题:ModuleNotFoundError: No module named 'thread',原因及解决办法。
- ASP.NET Core Web API中使用Swagger
- oracle scn隐藏参数,Oracle隐含参数scn不一致启动
- vue 地图使用navigator_9 个实验 + 3 个项目,带你入门 Vue.js 3 !
- 如何在浏览器上安装 VueDevtools工具
- 电商项目面试题 及mysql面试题 太难没啥用
- java开发业务流程图,什么是业务流程图?业务流程图如何绘制?
- 微软官方Power Query M语言规范参考手册(Power Query M function reference)
- 学习网络技术的一些常用论坛和网站
- Vj程序设计作业H5
- Linux下 Android adb驱动
- IDEA高效使用技巧--->IDEA批量修改变量快捷键和全局搜索键
- 【嵌入式软件开发岗位 ---- 面试总结01】
- c语言程序设计答案吉林大学,C语言程序设计课后习题答案吉林大学版武爱平.pdf...
- yslow_YSlow开发:设置
- Java入门及环境搭建idea安装和简单使用
- 浅谈过载保护(转自腾讯大讲堂)
- 《华为工作法》读书笔记
热门文章
- 端游之魂加手游之躯能否赋予手游新活力?
- GacUI:高效的布局系统
- 什么是GIT,以及git的常见命令
- 【CSS属性选择器灵活应用】以选择父元素下第一个不隐藏的class为“item“的div为例
- 熊市生存指南一:COSONFT带你穿越周期,进阶高级Crypto
- 10.4申论纸质书写出现问题总结
- cpu超线程优缺点_什么是超线程技术?_CPUCPU评测-中关村在线
- 三大根技术,七大新品,好望发布新一代摄像机
- 戴尔笔记本键盘,fn+f1/fn+f2快捷键如何取消按fn键
- 嵌入式设备AP配网实例分享