Java代码风格

1、换行

1.1、一个项目可以选择一行100个与120个(特殊情况)字符的限制,除了下述例外

  • 不可能满足列限制的行(例如,Javadoc中的一个长URL,或是一个长的JSNI方法参考)。
  • package和import语句。
  • 注释中那些可能被剪切并粘贴到shell中的命令行。

1.2、换行规则
如果是大括号内为空,则简洁地写成{}
如果是非空代码块则:
1) 左大括号前不换行, 左大括号后换行
2) 右大括号前换行,右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。

    public static void main(String[] args) {
        // 换行 缩进 4 个空格
        String say = "hello";
        // 运算符 的左右必须有一个空格
        int flag = 0;
        // if/for/while/switch/do 等保留字与括号之间都必须加空格
        // 括号内的 f 与左括号,0 与右括号不需要空格
        if (flag == 0) {
        // 这是示例注释,在双斜线之后有且仅有一个空格
            System.out.println(say);
        }

        // 左大括号前加空格且不换行;左大括号后换行
        if (flag == 1) {
            System.out.println("world");
        // 右大括号前换行,右大括号后有 else,不用换行
        } else {
            System.out.println("ok");
        // 在右大括号后直接结束,则必须换行
        }
    }

换行的基本准则是:倾向于在更高的语法级别处断开。

  • 非赋值运算符,符号随下文一起换行: .、 ::、 &、|、&&。
  • 如果在赋值运算符处断开(如=、+=、*=),运算符也与下文一起换行
  • 方法名或构造函数名与左括号(()留在同一行。
  • 逗号(,)与其前面的内容 留在同一行。

2、使用转义序列

对于具有特殊转义序列的任何字符(\b、 \t、\n、\f、\r、"、'及\),我们使用它的转义序列, 而不是相应的八进制(比如\012)或Unicode(比如\u000a)转义。
使用反斜杠“\”来引入一个转义序列,如“\r”表示回车、“\n”表示换行。

3 源文件结构

一个源文件按顺序包含:

3.1、许可证或版权信息(如需 应当被放在文件最前面。)
3.2、package语句,package语句不换行,行长度限制不适用于package语句
3.3、import语句,import不要使用通配符,import语句不换行

  • 所有的静态导入独立成组。
  • 所有的非静态导入独立成组。
  • 导入的名称以ASCII排序显示
  • 静态内部类无法静态导入
  • 不要导入不使用的类

3.4、有且仅有一个顶级类(public class)

  • 当一个类有多个构造函数或者多个同名的方法时,它们顺序出现,并且中间没有其他代码
  • 每个类应该以某种逻辑去排序它的成员,维护者应该要能解释这种排序逻辑。

以上每个部分之间用一个空行隔开。

5、变量

5.1、每次只声明一个变量
不要使用组合声明,如int a, b;。
long数值使用大写L后缀,而非小写(以避免与数字1混淆)。
5.2、需要时才声明,并尽快进行初始化
不要在一个代码块的开头把局部变量一次性都声明了,而是在第一次需要使用它时才声明。局部变量在声明时最好就进行初始化,或者声明后尽快进行初始化。
5.3、数组
数组初始化可以写成块状结构,中括号是类型的一部分:String[] args, 而非 String args[]

new int[] {
    0, 1, 2, 3
}

new int[]
    {0, 1, 2, 3}

6、结构

6.1、注解
应用于类、方法和构造函数,一个注解独占一行。
@Override:能用则用
单个的注解可以和方法签名的第一行出现在同一行。

@Override public int hashCode() { ... }

应用于字段的多个注解允许与字段出现在同一行。

@Partial @Mock DataLoader loader;

6.2、垂直空白
不要使用多个连续空行,语句块分隔只使用一个空行。
6.3、一行一个语句
6.4、不要省略大括号
与if、else、for、do及while语句一起使用,即使只有一条语句或是空,也应该把大括号写上。

7、注释

类、类属性、类方法的注释使用/** 内容*/格式,不得使用// xxx 方式

    /** To be removed in a future release. */
    private static void legacyMergeSort(Object[] a,
                                        int fromIndex, int toIndex) { }

方法内部
注释描述单行,使用如下方式

// clear to let GC do its work
for (int i = 0; i < size; i++)
    elementData[i] = null;

注释描述有多行,使用/* */注释,注意与代码对齐


http://www.hawstein.com/posts/google-java-style.html
Effective Java
阿里巴巴Java开发手册

展开阅读全文

没有更多推荐了,返回首页