语法糖(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)相关推荐

  1. 浅析java中的语法糖

    概述 编译器是一种计算机程序, 它主要的目的是将便于人编写.阅读.维护的高级计算机语言所写的源代码程序, 翻译为计算机能解读.运行的低阶机器语言的程序, 即可执行文件.而 javac 就是java语言 ...

  2. python语法糖是什么_Python语法糖Syntactic Sugar

    语法糖(Syntactic sugar): 计算机语言中特殊的某种语法 这种语法对语言的功能并没有影响 对于程序员有更好的易用性 能够增加程序的可读性 简而言之,语法糖就是程序语言中提供[奇技淫巧]的 ...

  3. C# 语法糖(Syntactic sugar)

    定义 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能 ...

  4. Java 中的语法糖,真甜。

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 我们在日常开发中经常会使用到诸如泛型.自动拆箱和装箱.内部 ...

  5. Java中的语法糖及反编译工具

    雪压枝头低,虽低不着泥 壹·Java中的反编译工具 贰·常见的12"颗"语法糖 switch forEach lambda if条件编译 变长参数 enum assert断言 tr ...

  6. 语法糖 Syntactic sugar: 复杂代码的等价简洁替代

    语法糖(Syntactic sugar) 在不改变代码所在位置.语法结构的前提下,实现了运行时的等价代码更简洁流畅,代码更语义自然,可读性高 写着爽,看着爽,就像吃了糖,效率高,错误少 例: 最基本的 ...

  7. JavaScript中的 语法糖 是什么?

    专业的解释 在计算机科学中,语法糖(syntactic sugar)是指编程语言中可以更容易的表达一个操作的语法,它可以使程序员更加容易去使用这门语言:操作可以变得更加清晰.方便,或者更加符合程序员的 ...

  8. 阿里云面试:什么是语法糖?Java中有哪些语法糖?

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...

  9. 什么是语法糖?Java中有哪些语法糖?

    本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理 1 语法糖 语 ...

最新文章

  1. Eclipse生成jar文件
  2. 您所知道的IT运维管理
  3. Python3 多线程问题:ModuleNotFoundError: No module named 'thread',原因及解决办法。
  4. ASP.NET Core Web API中使用Swagger
  5. oracle scn隐藏参数,Oracle隐含参数scn不一致启动
  6. vue 地图使用navigator_9 个实验 + 3 个项目,带你入门 Vue.js 3 !
  7. 如何在浏览器上安装 VueDevtools工具
  8. 电商项目面试题 及mysql面试题 太难没啥用
  9. java开发业务流程图,什么是业务流程图?业务流程图如何绘制?
  10. 微软官方Power Query M语言规范参考手册(Power Query M function reference)
  11. 学习网络技术的一些常用论坛和网站
  12. Vj程序设计作业H5
  13. Linux下 Android adb驱动
  14. IDEA高效使用技巧--->IDEA批量修改变量快捷键和全局搜索键
  15. 【嵌入式软件开发岗位 ---- 面试总结01】
  16. c语言程序设计答案吉林大学,C语言程序设计课后习题答案吉林大学版武爱平.pdf...
  17. yslow_YSlow开发:设置
  18. Java入门及环境搭建idea安装和简单使用
  19. 浅谈过载保护(转自腾讯大讲堂)
  20. 《华为工作法》读书笔记

热门文章

  1. 端游之魂加手游之躯能否赋予手游新活力?
  2. GacUI:高效的布局系统
  3. 什么是GIT,以及git的常见命令
  4. 【CSS属性选择器灵活应用】以选择父元素下第一个不隐藏的class为“item“的div为例
  5. 熊市生存指南一:COSONFT带你穿越周期,进阶高级Crypto
  6. 10.4申论纸质书写出现问题总结
  7. cpu超线程优缺点_什么是超线程技术?_CPUCPU评测-中关村在线
  8. 三大根技术,七大新品,好望发布新一代摄像机
  9. 戴尔笔记本键盘,fn+f1/fn+f2快捷键如何取消按fn键
  10. 嵌入式设备AP配网实例分享