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");