每天一分钟来一颗Java语法糖(一)语法糖介绍

每天一分钟来一颗Java语法糖(一)语法糖介绍

语法糖简介

语法糖(Syntactic Sugar/SyntaxSugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin(彼得·兰丁) 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。语法糖就是对现有语法的一个封装。简而言之,语法糖让程序更加简洁,有更高的可读性。

维基百科介绍如下

In computer science, syntactic sugar is syntax within a programminglanguage that is designed to make things easier to read or to express。

语法糖好处

  • 语法糖使得程序员更容易编写程序,更清晰准确表达业务逻辑。
  • 不仅仅是语法的转换,还包括一些小的改进。

解语法糖

Java虚拟机并不支持语法糖。语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。
Java中的语法糖只存在于编译期,在编译器将 .java 源文件编译成 .class 字节码时(javac命令)。
例如查看自动拆箱自动装箱的字节码,图片来自自动拆箱自动装箱
在这里插入图片描述
实际上源码还是简单的基础语法结构

如果查看com.sun.tools.javac.main.JavaCompiler的源码,就会发现在compile()中有一个步骤就是调用desugar(),这个方法就是负责解语法糖而实现的。
以下是来自笔者$JAVA_HOME/lib/tools.jar包内的com.sun.tools.javac.main.JavaCompiler类中的源码

public void compile(List<JavaFileObject> var1, List<String> var2, Iterable<? extends Processor> var3) {
   
   if (var3 != null && var3.iterator().hasNext()) {
   
       this.explicitAnnotationProcessingRequested = true;
   }

   if (this.hasBeenUsed) {
   
       throw new AssertionError("attempt to reuse JavaCompiler");
   } else {
   
       this.hasBeenUsed = true;
       this.options.put(Option.XLINT_CUSTOM.text + "-" + LintCategory.OPTIONS.option, "true");
       this.options.remove(Option.XLINT_CUSTOM.text + LintCategory.OPTIONS.option);
       this.start_msec = now();

       try {
   
           this.initProcessAnnotations(var3);
           this.delegateCompiler = this.processAnnotations(this.enterTrees(this.stopIfError(CompileState.PARSE, this.parseFiles(var1))), var2);
           this.delegateCompiler.compile2();
           this.delegateCompiler.close();
           this.elapsed_msec = this.delegateCompiler.elapsed_msec;
       } catch (Abort var8) {
   
           if (this.devVerbose) {
   
               var8.printStackTrace(System.err);
           }
       } finally {
   
           if (this.procEnvImpl != null) {
   
               this.procEnvImpl.close();
           }

       }

   }
}

private void compile2() {
   
   try {
   
       label44:
       switch(2.$SwitchMap$com$sun$tools$javac$main$JavaCompiler$CompilePolicy[
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值