在 if
、 else
、 for
、 do
和 while
语句中,即使主体为空或只包含一个语句,也应该写出花括号。
其他选择性的花括号,比如lambda表达式中的花括号,依然不是必须写出的。
非空块和块状结构中的花括号遵循Kernighan & Ritchie风格(“ 埃及括号 ”):
else
或逗号,则不换行。例外:在某些场景下,尽管规则允许你简单地使用一个以分号( ;
)结束的语句,但你仍可以在此选择使用一个语句块。在这种情况下,这个语句块开头的花括号前会有一个换行。这种特殊的语句块通常用于限定局部变量的作用范围,例如在switch语句中。
例子:
return () -> {
while (condition()) {
method();
}
};
return new MyClass() {
@Override public void method() {
if (condition()) {
try {
something();
} catch (ProblemException e) {
recover();
}
} else if (otherCondition()) {
somethingElse();
} else {
lastThing();
}
{
int x = foo();
frob(x);
}
}
};
一个空的代码块或类似块的结构可以按照K & R风格。或者,你也可以在打开后立即关闭它,中间没有字符也不需要换行(即 {}
), 除非 它是多块语句的一部分(直接包含多个块的语句,例如 if
/ else
或 try
/ catch
/ finally
)。
例如:
// 这是可以的
void doNothing() {}
// 这同样也是可以的
void doNothingElse() {
}
// 不可以这样:多块语句中不能出现打开即关闭的简略花括号
try {
doSomething();
} catch (Exception e) {}
每次打开一个新的代码块或块状结构时,缩进增加两个空格。当块结束时,缩进返回到之前的缩进级别。这种缩进级别同时适用于块中的代码以及注释。
每个语句后都应换行。
Java代码的列限制为100个字符。这里的“字符”指的是任何Unicode码位。除非以下特别说明,任何超出此限制的行都必须换行。
Tip
每个Unicode码位都算作一个字符,即使其显示宽度大于或小于一个字符。例如,如果使用 全角字符 ,你可能会选择在此规则严格要求的位置之前就换行。
例外:
术语说明: 将可以在一行内书写的代码分成多行的操作被称为换行。
没有全面且确定的公式明确指出在所有情况下如何进换行。很多时候,同一段代码有多种正确的换行方式。
Tip
注意: 尽管进换行的典型原因是为了避免超过列限制,但实际上在列限制内的代码也可以根据作者的判断进换行。
Tip
提示: 有时重构一个方法或定义一个局部变量可以解决超过列限制的问题,而不需要换行。
换行的首要准则是:倾向于在 更高级的句法层次 进换行。此外:
这同样适用于以下”类运算符”的符号:
- 点分隔符(
.
)- 方法引用的两个冒号(
::
)- 类型约束中的与符号(
<T extends Foo & Bar>
)- catch块中的管道符号(
catch (FooException | BarException e)
)
- 这也适用于增强的
for
循环(”foreach”)语句中的”类赋值运算符”————冒号。
(
)。,
)应紧挨着它前面的标记。MyLambda<String, Long, Object> lambda = (String label, Long value, Object obj) -> { ... }; Predicate<String> predicate = str -> longExpressionInvolving(str);
Tip
注意: 换行的主要目的是使代码更清晰,其不一定是行数最少的。
换行时,第一行之后的每一行(每一个连续的行)至少从原行缩进4个空格。
当有多个连续行时,根据需要,缩进可以在4个空格之外变化。通常,只有当两个连续行从语法上开始于平行的元素时,它们才使用相同的缩进级别。