原文地址:https://google.github.io/styleguide/javaguide.html
GIthub上GoogleCode风格的配置文件(支持Eclipse IDE和IntelliJ IDE):https://github.com/codeset/google-java-styleguide
1简介
本文档作为Java编程语言中源代码的Google编码标准的完整定义。当且仅当它遵守本文中的规则时,Java源文件被描述为在Google Style中。
与其他编程风格指南一样,所涵盖的问题不仅包括格式化的美学问题,也包括其他类型的约定或编码标准。但是,本文档主要关注我们普遍遵循的快速规则 ,并避免提供不可明确强制执行的建议(无论是通过人工还是工具)。
1.1术语注释
在本文件中,除非另有说明:
- 术语类被包含性地用于表示“普通”类,枚举类,接口或注释类型(
@interface
)。 - 术语成员 (类的)包含地用于表示嵌套类,字段,方法或构造函数 ;即除了初始化器和注释之外的类的所有顶级内容。
- 术语注释总是指实现注释。 我们不使用短语“文档注释”,而是使用通用术语“Javadoc”。
其他“术语说明”将偶尔出现在整个文档中。
1.2指南说明
本文档中的示例代码是非规范的 。 也就是说,虽然示例是在Google风格,但它们可能不会说明代表代码的唯一时尚的方式。 示例中所做的可选格式选择不应作为规则强制执行。
2源文件基础
2.1文件名
源文件名由其包含的顶级类(其中包含正好一个 )的区分大小写的名称,以及.java
扩展名组成。
2.2文件编码:UTF-8
源文件以UTF-8编码。
2.3特殊字符
2.3.1空格字符
除了行终止符序列, ASCII水平空格字符 ( 0x20 )是在源文件中任何位置出现的唯一的空格字符。这意味着:
- 字符串和字符文字中的所有其他空白字符都将被转义。
- 制表符不用于缩进。
2.3.2特殊转义序列
对于具有特殊转义序列 ( \b
,\t
,\n
,\f
,\r
,\"
,\'
和\\
)的任何字符,使用该序列而不是相应的八进制Unicode(例如\u000a
)转义。
2.3.3非ASCII字符
对于剩余的非ASCII字符,使用实际的Unicode字符(例如∞
)或等效的Unicode转义(例如\u221e
)。 选择仅取决于哪些使得代码更容易阅读和理解 ,尽管Unicode转义字符串字面值和注释强烈阻止。
提示:在Unicode脱机情况下,偶尔即使使用实际的Unicode字符,解释性注释也会非常有用。
例子:
例 | 讨论 |
---|---|
String unitAbbrev="μs"; |
最好:完全清楚,即使没有评论。 |
String unitAbbrev="\u03bcs";// "μs" |
允许,但没有理由这样做。 |
String unitAbbrev="\u03bcs";// Greek letter mu, "s" |
允许,但尴尬,容易犯错误。 |
String unitAbbrev = "\u03bcs"; |
差:读者不知道这是什么。 |
return'\ufeff'+ content;// byte order mark |
良好:对不可打印字符使用转义,如有必要,请注释。 |
提示:不要因为某些程序可能无法正确处理非ASCII字符而使您的代码变得不可读。如果这应该发生,那些程序被打破 ,它们必须是固定的 。
3源文件结构
源文件由以下顺序组成 :
- 许可或版权信息(如果存在)
- 软件包语句
- 导入语句
- 完全一个顶级类
正好一个空白线分隔存在的每个部分。
3.1许可或版权信息(如果存在)
如果许可证或版权信息属于文件,则它属于此处。
3.2包装声明
包语句不是线包装 。 列限制(第4.4节, 列限制:100 )不适用于包语句。
3.3导入语句
3.3.1无通配符导入
不使用静态或其他方式的通配符导入 。
3.3.2没有线包装
导入语句不是线包装的 。 列限制(第4.4节, 列限制:100 )不适用于import语句。
3.3.3订购和间距
导入顺序如下:
- 在单个块中的所有静态导入。
- 所有非静态导入在单个块中。
如果存在静态和非静态导入,则单个空白行分隔两个块。 import语句之间没有其他空行。
在每个块中,导入的名称以ASCII排序顺序显示。 ( 注意:这与以ASCII排序顺序的import 语句不同 ,因为'。'排在';'前面)。
3.3.4没有类的静态导入
静态导入不用于静态嵌套类。 它们以正常进口进口。
3.4类声明
3.4.1完全一个顶级类声明
每个顶级类都驻留在自己的源文件中。
3.4.2类内容的排序
为类的成员和初始化器选择的顺序可以对可学习性有很大的影响。 然而,没有一个正确的方法来做到这一点; 不同的类可以以不同的方式对其内容进行排序。
重要的是每个类使用一些逻辑顺序 ,维护者可以解释如果问。例如,新方法不仅习惯性地添加到类的末尾,因为这将产生“按照添加日期的顺序”排序,这不是逻辑排序。
3.4.2.1重载:从不分裂
当一个类有多个构造函数或者多个同名的方法时,这些顺序出现,中间没有其他代码(甚至不是私有成员)。
4格式化
术语注意: 块状构造指的是类,方法或构造函数的主体。注意,通过关于数组初始化器的第4.8.3.1节,任何数组初始化器都可以被视为块状构造。
4.1大括号
4.1.1在可选时使用括号
大括号与if
,else
,for
,do
和while
语句一起使用,即使主体为空或仅包含单个语句。
4.1.2非空块:K&R风格
大括号遵循Kernighan和Ritchie风格(“ 埃及括号 ”)用于非空块和块状结构:
- 在大括号前没有换行符。
- 开头大括号后的换行符。
- 换行前的换行。
- 关闭大括号后的换行符, 仅当该大括号终止语句或终止方法,构造函数或命名类的主体时。例如,如果后面跟着
else
或逗号,那么大括号后面没有换行符。
例子:
- 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();
- }
- }
- };
枚举类的一些例外在第4.8.1节“枚举类”中给出。
4.1.3空块:可能简洁
空块或块状构造可以是K&R样式(如第4.1.2节所述)。或者,它可以在打开后立即关闭,在({}
)之间没有字符或换行符,除非它是多块语句的一部分 (直接包含多个块:if/else
或try/catch/finally
)。
例子: