在Java 8中,“sugar”,“desugar”是什么?

在Java 8中,我经常听到有关“加糖”和“解脱”的问题,这些术语是什么意思? 他们是概念上的还是语法上的?

一些例子:

默认迭代循环resugaring到Java

关于语法糖在编写中的观察。

在编程中通常指的是那些甜蜜的添加,大多是捷径,使得一些构造更容易打字和阅读(实际上,后者在程序的生命周期中是最重要的)。

维基百科有一个语法糖的定义,但你应该注意到,并非所有的糖本质上都是句法的(并不是所有的最近的甜食都只是编译器的改变)。

这里有一些例子 :

  • 后缀和前缀增量运算符( i++++i )。 他们唯一的目的是避免写一个额外的陈述。 他们是纯糖。
  • +=|=&=等由同一种糖制成。
  • 原始types和对象之间的隐式转换也是糖。
  • types推断也是糖。
  • 与Java 8一起使用的Lambdaexpression式是其他types的糖(这不仅仅是语法上的)

Java被广泛认为不够简洁,特别是与现代语言相比。 这就是为什么那些有助于使代码更快读取的增加是值得欢迎的。

最后,我要指出的是,虽然缺less糖可以使你的程序变胖,但是过多的糖,导致许多不同的方式来写相同的东西,可以使你的语言变得不稳定,你的程序不那么一致,更难以维护。 另一种糖,API糖,往往是一个瘟疫,使API难以掌握,特别是当它是由增加(例如超载)。

就是说desugaring指的是要么

  • 删除语言中所有冗余的过程
  • 代码处理器通过它查找加糖语句后面的内容(例如,这可能涉及types推断)

在Java 8中,“desugaring”似乎具有非常具体的含义。似乎是一个全面的术语来expressionlambdaexpression式可能绑定到实际的具体方法调用的各种方式。

这个关于“Lambdaexpression式的翻译”的文档似乎有真实的细节,如果你对细节感兴趣的话。

文件中的关键词:

将lambda转换成字节码的第一步是将lambda体转换成一个方法。

一般来说,javac中的“desugaring”允许用已有的语言来表示一些语言特性。 这允许在字节码中表示它们,而不对类文件格式做大的改变。 也因为这个原因,编译器的后端比前端更稳定。 这并不意味着每个新的语言特征都只是语法上的糖,绝对不是lambdaexpression式和方法引用的情况。 编译器中有更多的“desugaring”的例子:

  • 对于每个循环都被“去除”为循环的C风格
  • 断言是“脱离”的一个句子
  • 内部类被表示为一个独立的类

您也可以调查什么发生与string开关,键入擦除,…