【发布时间】:2012-06-11 21:38:45
【问题描述】:
Java 允许某些关键字后跟语句或语句块。例如:
if (true)
System.out.println("true");
do
System.out.println("true");
while (true);
编译和
if(true) {
System.out.println("true");
}
do {
System.out.println("true");
} while (true);
for、while 等关键字也是如此。
但是,某些关键字不允许这样做。 synchronized 需要一个块语句。 try ... catch ... finally 也一样,它需要在关键字之后至少有两个块语句。例如:
try {
System.out.println("try");
} finally {
System.out.println("finally");
}
synchronized(this) {
System.out.println("synchronized");
}
有效,但以下内容无法编译:
try
System.out.println("try");
finally
System.out.println("finally");
synchronized (this)
System.out.println("synchronized");
那么为什么Java中的一些关键字需要一个块语句,而另一些则允许一个块语句以及单个语句?这是语言设计的不一致,还是有一定的原因?
【问题讨论】:
-
我怀疑单语句方法被不赞成和使用只是因为在 c 中可能有类似的东西。因为 c 没有同步或尝试他们可能选择了“更安全”的选项。
-
因为这是语法; AFAIK 没有技术原因必须有一个块,因为它可以自动创建。
-
这是我的猜测,FWIW:语言设计者希望保持与其他语言足够相似的语法以帮助学习。但是感觉在哪里添加了新的语言功能,他们会强制执行一些人认为更好的编码标准。或者,也许,对于不太常用的语言功能,他们追求更好的编码理念?
-
Scala 没有这样的限制;语法是组合式的,大括号被统一处理,这是我(显然是 OP)碰巧欣赏的语言设计原则。
-
好吧,我不想开始讨论这是好是坏。我只是想知道这件事的根源,因为这对我来说似乎有些矛盾。