在Java 8上下文中,“糖”,“糖”是什么?


107

我在Java 8中听说过更多的“加糖”和“减糖”这些术语是什么意思?他们是概念上还是句法上的。

一些例子:

默认迭代循环恢复为Java

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

Answers:


136

在编程中,sugar通常指的是那些甜蜜的添加,主要是捷径,使某些结构更易于键入和阅读(实际上,后者在程序的生命周期中是最重要的)。

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

这里有一些例子 :

  • 后缀和前缀增量运算符(i++++i)。它们的唯一目的是避免编写其他语句。他们是纯糖。
  • +=|=&=等都是由同种糖的。
  • 基本类型和对象之间的隐式转换也是糖。
  • 类型推断也是糖。
  • Java 8附带的Lambda表达式是另一种形式的糖(这不仅仅是语法上的

人们普遍认为Java不够简洁,特别是与现代语言相比。这就是为什么欢迎那些有助于使代码阅读更快的补充。

最后,我要指出的是,虽然缺少糖会使您的程序变胖,但是糖过多会导致许多不同的方式来编写相同的东西,这会使您的语言变得不稳定,并且程序的连贯性和维护难度会降低。API糖是另一种糖,通常是瘟疫,这使得API较难掌握,尤其是当它是由添加物(例如超载)制成时。

话虽这么说,退潮还是

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

6
+1您还可以提及糖液部分,因为这将完成OP所要求的答案!:)
Rahul Tripathi 2014年

6
@justhalf想一想,当您将能够删除所有创建的接口以传递功能时,程序将变薄多少。
DenysSéguret2014年

42
“语法糖会引起分号癌。” -艾伦·珀利斯(Alan Perlis)
斯图尔特·马克

12
在C的早期,后缀和前缀运算符曾经是语法糖。按照当今的标准,早期的编译器是愚蠢的,那些运算符可以用一条机器代码指令实现,但是等效的赋值语句却不能。因此,他们可以编写更高效的程序。
Raedwald 2014年

3
@justhalf这个问题引起了很多关注。在这种情况下,让管理员删除似乎没有建设性的评论并不罕见。我认为您不必删除您的评论,但是并没有带来太多好处。
DenysSéguret2014年

17

在Java 8中,“ Desugaring”似乎具有非常特殊的含义。这似乎是一个笼统的术语,用于表示lambda表达式可以绑定到实际的具体方法调用的各种方式。

如果您对特定内容感兴趣,则有关“ Lambda表达式的翻译”的文档似乎提供了正在发生的事情的真实细节。

该文档中的一个关键短语:

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


6

通常,javac中的“ desugaring”允许使用预先存在的语言功能来表示某些语言功能。这样就可以用字节码表示它们,而无需对类文件格式进行大的更改。同样由于这个原因,编译器的后端比前端更稳定。这并不意味着每个新语言功能都只是语法糖,绝对不是lambda和方法引用的情况。编译器中还有更多的“ desugaring”示例:

  • 对于每个循环,循环使用“ C风格”的C风格
  • 断言被if句子“拒绝”
  • 内部类表示为独立类

您还可以调查String开关,擦除类型,...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.