跳转到主要内容 链接 搜索 菜单 展开 文档 (外部链接)

代码风格指南

我们不会因为您未检查代码风格而 恢复提交令牌 。请相应地计划并使用正确的风格!您已被警告。

关于此风格指南的一些说明:我们已尝试使其尽可能接近默认的IntelliJ风格检查器。该风格检查器还包括一些IntelliJ不会检查的"代码质量"检查。

通过运行自动风格检查器来了解这些规则可能会更容易。您可以通过在左侧栏中右键单击文件并选择"检查风格"来在IntelliJ中运行风格检查器。这将在所选文件中生成风格错误列表。在再次运行风格检查器之前,请确保保存或重新编译您的文件。

screenshot of intellij with right-click menu open

本代码风格指南可能也不完整。我已尽力使其尽可能全面,但可能遗漏了一些新增规则的描述。

空白字符

  1. 每个文件必须以换行符序列结尾。

  2. 文件不得包含水平制表符。只使用空格进行缩进。

  3. 不要在以下位置添加空白字符:

    • 在泛型类型指定内的 < > 周围( List<Integer> ,而不是 List <Integer> List< Integer > )。
    • 前缀运算符 ! -- ++ 、一元 - 或一元 + 之后。
    • ; 之前或后缀运算符 -- ++ 之前。
    • ( 之后或 ) 之前。
    • . 之后。
  4. 请在以下位置添加空白字符:

    • ; , 或类型转换之后(例如, (String) x ,而不是 (String)x )。
    • 二元运算符(例如, * + )和比较运算符周围。
    • 赋值运算符周围(例如, = += )。
    • 三元条件运算符中的 ? : 周围( x > 0 ? x : -x )。
    • 关键字 assert catch do else finally for if return try while 周围。
  5. 通常,如果您需要使用多行来表示单个语句,请在运算符之前换行(插入换行符),如下所示:

    ... + 20 * X
        + Y;
    
  6. 不要用空格将方法名与方法调用中的 ( 分开。但是,对于长行,您可以用换行符后跟空格(用于缩进)来分隔它们。

缩进

  1. 基本缩进单位是4个空格。

  2. 每个代码块级别缩进一个基本缩进单位(代码块通常用 { } 包围),如下所示:

    if (x > 0) {
       r = -x;
    } else {
       r = x;
    }
    
  3. case 标签在其封闭的 switch 的基础上再缩进一级,如下所示:

    switch (op) {
       case '+':
             addOpnds(x, y);
             break;
       default:
             ERROR();
    }
    
  4. 续行缩进一个基本缩进单位。

大括号

  1. 在所有 if while do for 语句的代码块周围使用 { } 大括号。

  2. } 大括号放在后续的 else finally catch 放在同一行,例如:

    if (x > 0) {
       y = -x;
    } else {
       y = x;
    }
    
  3. 将开启代码块的 { 放在行尾。通常,它放在 if for while switch do 、方法头或类头的末尾。如果行长度迫使它换到下一行,则不要缩进它,并将其单独放在一行上。

注释

  1. 方法应有javadoc注释说明行为、参数(使用@param标签或其他方式)和返回类型。

  2. 返回非void值的方法必须在Javadoc注释中描述返回值,可以使用"@return"标签或在包含"return"、"returning"或"returns"等词的运行文本中描述。

  3. 每个Javadoc注释必须以正确形成的句子开头,首字母大写,以句点结尾。

命名

  1. 静态最终常量的名称必须全部大写(例如,RED、DEFAULT_NAME)。

  2. 参数、局部变量和方法的名称必须以小写字母开头,或者由单个大写字母组成。

  3. 类型(类)的名称,包括类型参数,必须以大写字母开头。

  4. 包的名称必须以小写字母开头。

  5. 实例变量和非最终类(静态)变量必须以小写字母或"_"开头。

导入

1. 不要 use 'import PACKAGE.*', unless the package 是 java.lang.Math, java.lang.Double, or org.junit.Assert. 'import static CLASS.*' 是 确定.
  1. 不要重复导入同一个类或静态成员。

  2. 不要导入您不使用的类或成员。

Java 风格惯例

  1. 数组类型的"[]"应写在元素类型名称之后,而不是声明符之后。写"String[] names",而不是"String names[]"。

  2. 方法、类或字段的修饰符应按以下顺序编写:

    1. public、protected 或 private。
    2. abstract 或 static。
    3. final、transient 或 volatile。
    4. synchronized。
    5. native。
    6. strictfp。
  3. 不要在冗余的情况下显式修饰方法、字段或类:

    1. 不要将接口或注解中的方法标记为"public"或"abstract"。
    2. 不要将接口或注解中的字段标记为"static"、"public"或"final"。
    3. 不要将 final 类中的方法标记为"final"。
    4. 不要将嵌套接口标记为"static"。
  4. 不要在控制语句中使用空代码块(内部只有空白或注释的"{ }")。有一个例外:catch 块可以只包含如下形式的注释:

    /* Ignore EXCEPTIONNAME. */
    
  5. 通过给"魔术数字"赋予符号名称来避免在代码中使用它们,例如:

    public static final int MAX_SIZE = 100;
    

    例外情况是数字 -1、0、1、2、3、4、5、6、7、8、9、0.25、0.5。

  6. 不要尝试捕获 异常、RuntimeError 或 错误 异常。

  7. 写"b"而不是"b == true",写"!b"而不是"b == false"。

  8. if (condition) {
       return true;
    } else {
       return false;
    }
    

    替换为

    return condition;
    
  9. 只有类的静态 final 字段才能是 public 的。其他字段必须是 private 或 protected 的。这也适用于嵌套类。

  10. 只有静态方法和字段的类不能有 public(或默认的)构造函数。

  11. 只有私有构造函数的类必须声明为"final"。

避免易错语法

  1. 如果一个类重写了"equals",它也必须重写"hashCode"。这将在我们学习 hashCode 后适用。

  2. 局部变量和参数不能隐藏或遮蔽字段名。处理例如简单控制字段的 getter/setter 方法的首选方式是在字段名前加上"_"前缀,例如:

    public double getWidth() {
       return _width;
    }
    
    public void setWidth(double width) {
       _width = width;
    }
    
  3. 不要使用嵌套赋值,例如"if ((x = next()) != null) …"。虽然这在 C 语言中可能很有用,但在 Java 中几乎从来不需要。

  4. 每个"switch"语句都必须包含一个"default"分支。

  5. "switch"语句的每个分支都必须以"break"语句或如下形式的注释结束:

    /* fall through */
    
  6. 不要用"=="比较字符串字面量。应该写:

    if (x.equals("something"))
    

    而不是:

    if (x == "something")
    

    有些情况下你确实想使用"==",但你在本课程中不太可能遇到这些情况。

限制

  1. 任何文件不得超过2000行。

  2. 任何行不得超过120个字符。

  3. 任何方法不得超过80行。

  4. 任何方法不得超过8个参数。

  5. 每个文件必须只包含一个外部类(嵌套类可以)。