Java 是否会对JLS不利';这是压缩的哲学吗?

Java 是否会对JLS不利';这是压缩的哲学吗?,java,optimization,do-while,jls,Java,Optimization,Do While,Jls,在编写另一个时,请执行。。。在Java中循环时,我开始考虑它的语法。一个典型的程序员会写这样的东西 do { somethng(); }while(booleanValue); 但是,Java有一种内置的压缩方法,允许程序员在循环中只有一行时删除大括号(这对于Java表达式是典型的): 这可以被认为和写为 do something(); while(booleanValue); 甚至 do; while(booleanValue); 这很有趣。这引起了我的注意,这是一个必须跨两行读取和

在编写另一个
时,请执行。。。在Java中循环时,我开始考虑它的语法。一个典型的程序员会写这样的东西

do {
  somethng();
}while(booleanValue);
但是,Java有一种内置的压缩方法,允许程序员在循环中只有一行时删除大括号(这对于Java表达式是典型的):

这可以被认为和写为

do something();
while(booleanValue);
甚至

do;
while(booleanValue);
这很有趣。这引起了我的注意,这是一个必须跨两行读取和运行的Java语句,这意味着在运行
do
行之后,直到运行
while
行,操作才完成。请记住,其他表达式只有一行:

if(booleanValue) something();
while(booleanValue) something();
for(Object declaration; booleanValue; operation()) something();
for(Object declaration : iterableObject) something();
throw throwableObject;
return anyObject;
switch(integer) {}
//case is excluded because it operates a lot more like a goto operation than a statement
所以我开始思考,不是关于为什么会这样,而是关于如何压缩这个语句

假设“行”是以分号(
)结尾或包含在大括号(
{
}
)中的任何内容,让我们了解一下:一个
do
语句必然需要运行两行
一个
do
语句必须至少继续运行,直到它到达一个空的
,而
语句

那为什么要用大括号呢?

让我们看看使用这种语法的一些场景。一个
do…while
语句和一个附加语句如何:

do something();
while(booleanValue();
好吧,这里没有什么新的。关于
do…while
语句和三个随附语句:

do
  statement1();
  statement2();
  statement3();
while(booleanValue);
在这里,Java将看到它是一个
do
语句,在看到空的
while
语句之前,它将运行第2、3和4行。此时,它知道我们已经准备好结束循环,计算表达式,并可能返回到
do
或退出循环

如果你认为某件东西会破坏它,那该怎么办;嵌套的
while
循环:

do
  statement1();
  while(booleanValue1)
    statement2();
while(booleanValue2);
在这里,Java看到它是一个
do
语句并输入它,然后正常运行第2行。在第
3行
,它看到这是一个
while
语句。在这一点上,它必须决定这是否是循环的结束。它检查
while
语句,发现它不是空的,因此不是
do
循环的结尾。它进入
while
语句并循环第3行和第4行,直到不再循环为止。然后,它会看到另一个
while
语句,并且在检查时,会看到它是空的,因此,
do
语句的结尾。它对它进行评估,可能返回到第2行,也可能不返回,但我们现在不关心

但是Supuhstar,这看起来确实是一个很大的计算!这不会降低JVM的速度吗

不一定!这一切都可以在编译时完成,就像Java确定上面列出的任何其他语句是否为空一样(例如,尝试编译
while(true);
将导致下一行编译时出现错误“
unreachable statement
”)

所以,很像

for(Object declaration : iterableObject)
  somethingInvolving(declaration);
汇编成

Iterator<Object> i = iterableObject.iterator();
while(i.hasNext())
{
  Object declaration = i.next();
  somethingInvolving(declaration);
}
可以编译成

do
{
  statement1();
  while(booleanValue1)
  {
    statement2();
  }
}
while(booleanValue2);
但是Supuhstar,Java不关心缩进!你的书可以有缩进,还是完全没有

当然可以!编译器也同样容易编译

do
  statement1();
  while(booleanValue1)
    statement2();
while(booleanValue2);
当然

do statement1(); while(booleanValue1) statement2(); while(booleanValue2);
这两种方法的作用完全相同


是否有其他人同意将此作为Java语法包括在内,还是我不知道有什么明显的原因不能这样做?

这一特殊的陈述让我有点困惑:

它检查while语句并发现它不是空的, 因此不是do循环的结束

因为你说的“不空”是什么意思?虽然允许循环为“空”:

这在您的计划下是有效的,即使第一个while循环将关闭do-while而不是第二个while

话虽如此,你所建议的语法不会是……我不认为。。。。但这并不重要,因为它永远不会被引入,因为语言设计者对使Java成为更干净或更简洁的语言不感兴趣


您甚至可以说冗长是Java哲学的基本部分。编译器可以推断或允许但不允许的事情有很多。好消息是,还有很多像Scala这样的现代语言可以让您编写更简短、更具表现力的代码。

这句话让我有点困惑:

它检查while语句并发现它不是空的, 因此不是do循环的结束

因为你说的“不空”是什么意思?虽然允许循环为“空”:

这在您的计划下是有效的,即使第一个while循环将关闭do-while而不是第二个while

话虽如此,你所建议的语法不会是……我不认为。。。。但这并不重要,因为它永远不会被引入,因为语言设计者对使Java成为更干净或更简洁的语言不感兴趣

您甚至可以说冗长是Java哲学的基本部分。编译器可以推断或允许但不允许的事情有很多。好消息是,还有很多像Scala这样的现代语言允许您编写更简短、更具表现力的代码。

想想这段代码

    if(true)
        if(false)
            System.out.println("x");
    else
        System.out.println("y");
它打印“y”。有时候,对于没有大括号的人来说,这太令人困惑了。

想想这段代码

    if(true)
        if(false)
            System.out.println("x");
    else
        System.out.println("y");

它打印“y”。有时候,对于没有牙套的人来说,这太让人困惑了。

类似于不可改变的说法,我也看到了这个例子:

if(false)
    //System.out.println("x");

System.out.println("Done");

你能看到为什么第二次打印没有运行吗?

类似于Unreputable所说的,我也看到了这个例子:

if(false)
    //System.out.println("x");

System.out.println("Done");

你能看到为什么第二次打印没有运行吗?

在Java中是一个空语句,这就是
if(false)
    //System.out.println("x");

System.out.println("Done");