在Java 8的上下文中,什么是“糖”,“desugar”术语?

2022-08-31 08:50:30

我在Java 8中更频繁地听到“糖化”和“脱糖”,这些术语是什么意思?它们是概念性的还是句法上的。

一些例子:

默认迭代循环重新苏取到 java

编译中关于句法糖的观察。


答案 1

在编程中,sugar通常是指那些甜蜜的补充,主要是快捷方式,使一些结构更容易键入和阅读(在实践中,后者是程序生命周期中最重要的)。

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

以下是一些例子:

  • 后缀和前缀增量运算符 ( 和 )。它们的唯一目的是避免编写其他语句。它们是纯糖。i++++i
  • +=、、等均由同一种类的糖制成。|=&=
  • 基元类型和对象之间的隐式转换也是糖。
  • 类型推断也是糖。
  • Lambda表达式,随Java 8一起提供,是一些其他类型的糖(这个不仅仅是语法)

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

最后,我只想指出,虽然缺乏糖会使你的程序变胖,但过量的糖,导致许多不同的方法来编写相同的东西,会让你的语言变得恶心,你的程序不那么连贯,更难维护。另一种糖,API糖,通常是一种瘟疫,它使API更难掌握,特别是当它由添加物制成时(例如超载)。

话虽如此,脱糖是指

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

答案 2

“Desugaring”在Java 8中似乎有一个非常具体的含义。它似乎是一个包罗万象的术语,用于表示 lambda 表达式可能绑定到实际具体方法调用的各种方式。

这篇关于“Lambda 表达式的翻译”的文档提供了有关正在发生的事情的真实细节,如果您对具体细节感兴趣。

文档中的关键短语:

将 lambda 转换为字节码的第一步是将 lambda 主体解加为方法。


推荐