java语法糖

【README】

1,本文翻译自 wikipedia ,为了解 语法糖定义;

2,本文还扩展性的引入了 java语法糖例子;


【1】语法糖定义 from wikipedia

refer2 https://en.wikipedia.org/wiki/Syntactic_sugar

在计算机科学中,语法糖是一种编程语言中的语法,旨在使事物更易于阅读或表达(或使程序员的工作更加容器)

它使语言更适合人类使用:可以更清晰、更简洁地表达事物,或者以某些人可能更喜欢的另一种风格表达。

例如,许多编程语言提供了用于引用和更新数组元素的特殊语法。

抽象地说,数组引用是一个有两个参数的过程:一个数组和一个下标向量,可以表示为 get_array(Array, vector(i,j))。

相反,许多语言提供了诸如 Array[i,j] 之类的语法。类似地,数组元素更新是一个由三个参数组成的过程,例如 set_array(Array, vector(i,j), value),但是许多语言提供了诸如 Array[i,j] = value 的语法。

一种语言结构可以称为语法糖,如果它从语言中删除而不影响语言的功能:即功能和表达能力将保持不变。

语言处理器,包括编译器和静态分析器,通常在处理前把糖化结构扩展为更基本的结构,这个过程有时被称为“脱糖”。

小结: 这里应该是把语法糖定义说清楚了,即

  • 语法糖是一种语言结构,即便移除(替换)这种语言结构不会影响语言功能,其目的在于 使写程序变得更加容易(或使代码变得更加简洁)
  • 语法糖存在于源代码中,编译器在编译的时候会把语法糖结构解析(替换)为基本语法;

【2】java语法糖例子

【2.1】java枚举类

1)定义枚举类

这是一种语法糖结构, 因为代码简洁,但其对应的基本语法不是这个样子

public enum EnumClass {
    INSTANCE;
}

2)反编译查看枚举类解析后的基本语法

 

D:\workbench_idea\study4vw\vwstudy01\src>javac -encoding utf-8  com/cmc/vw/javaoop/enumtest/EnumClass.java

D:\workbench_idea\study4vw\vwstudy01\src>javap com.cmc.vw.javaoop.enumtest.EnumClass
Compiled from "EnumClass.java"
public final class com.cmc.vw.javaoop.enumtest.EnumClass extends java.lang.Enum<com.cmc.vw.javaoop.enumtest.EnumClass> {
  public static final com.cmc.vw.javaoop.enumtest.EnumClass INSTANCE;
  public static com.cmc.vw.javaoop.enumtest.EnumClass[] values();
  public static com.cmc.vw.javaoop.enumtest.EnumClass valueOf(java.lang.String);
  static {};
}

我们发现,枚举类反编译后,或者去糖后,其基本语法是

枚举类就是一个继承 Enum的 final class类;但是我们在定义枚举类的时候,使用关键字enum就可以了;


【2.2】foreach语法糖

1)foreach

public class ListForeach {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3);
        for (Integer i :list) { // foreach 语法糖 
            System.out.println(i);
        }
    }
}

2)反编译查看字节码

 3)代码解说

很明显, foreach语法糖的底层调用了 iterator() 获取迭代器;

然后调用 迭代器的 hasNext() 和 next() 方法分别判断是否有下一个,获取下一个元素 来获取下一个元素的;

4)foreach语法糖对应的基本语法如下:

// foreach语法糖 解糖后的基本语法
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3);
        Iterator<Integer> it =  list.iterator();
        while(it.hasNext()) {
            it.next();
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值