格式

选择性的花括号的使用

ifelsefordowhile 语句中,即使主体为空或只包含一个语句,也应该写出花括号。

其他选择性的花括号,比如lambda表达式中的花括号,依然不是必须写出的。

非空块:K & R 风格

非空块和块状结构中的花括号遵循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 / elsetry / catch / finally )。

例如:

// 这是可以的
void doNothing() {}

// 这同样也是可以的
void doNothingElse() {
}
// 不可以这样:多块语句中不能出现打开即关闭的简略花括号
try {
    doSomething();
} catch (Exception e) {}

代码块缩进:增加2个空格

每次打开一个新的代码块或块状结构时,缩进增加两个空格。当块结束时,缩进返回到之前的缩进级别。这种缩进级别同时适用于块中的代码以及注释。

一行一个语句

每个语句后都应换行。

列限制:100

Java代码的列限制为100个字符。这里的“字符”指的是任何Unicode码位。除非以下特别说明,任何超出此限制的行都必须换行。

Tip

每个Unicode码位都算作一个字符,即使其显示宽度大于或小于一个字符。例如,如果使用 全角字符 ,你可能会选择在此规则严格要求的位置之前就换行。

例外:

  • 在某些情况下,遵循列限制是不可能的(例如,Javadoc中的长URL,或者一个长的JSNI方法引用)。
  • 包声明和导入语句。
  • 注释中可能会被复制并粘贴到shell的中命令行。
  • 在极少数情况下需要使用的非常长的标识符是允许超过列限制的。

4.5. 换行

术语说明: 将可以在一行内书写的代码分成多行的操作被称为换行。

没有全面且确定的公式明确指出在所有情况下如何进换行。很多时候,同一段代码有多种正确的换行方式。

Tip

注意: 尽管进换行的典型原因是为了避免超过列限制,但实际上在列限制内的代码也可以根据作者的判断进换行。

Tip

提示: 有时重构一个方法或定义一个局部变量可以解决超过列限制的问题,而不需要换行。

4.5.1. 换行的位置

换行的首要准则是:倾向于在 更高级的句法层次 进换行。此外:

    1. 当一行在非赋值运算符处断开时,换行的位置位于符号之前。
    • 这同样适用于以下”类运算符”的符号:

      • 点分隔符( .
      • 方法引用的两个冒号( ::
      • 类型约束中的与符号( <T extends Foo & Bar>
      • catch块中的管道符号( catch (FooException | BarException e)
    1. 当一行在赋值运算符处断开时,换行位置通常位于符号之后,但两种方式都是可以接受的。
    • 这也适用于增强的 for 循环(”foreach”)语句中的”类赋值运算符”————冒号。
    1. 方法或构造函数的名称应紧挨着其后的左括号( ( )。
    1. 逗号( , )应紧挨着它前面的标记。
    1. lambda箭头旁绝不换行,但是如果lambda的主体仅由单个未括起来的表达式组成,那么可以紧跟在箭头后面换行。示例:
    MyLambda<String, Long, Object> lambda =
        (String label, Long value, Object obj) -> {
            ...
        };
    
    Predicate<String> predicate = str ->
        longExpressionInvolving(str);

Tip

注意: 换行的主要目的是使代码更清晰,其不一定是行数最少的。

行缩进至少4个空格

换行时,第一行之后的每一行(每一个连续的行)至少从原行缩进4个空格。

当有多个连续行时,根据需要,缩进可以在4个空格之外变化。通常,只有当两个连续行从语法上开始于平行的元素时,它们才使用相同的缩进级别。