Java代码风格和在idea中的一些设置

源文件基本设置

1. 文件名

驼峰标识,.java结尾

2. 编码

统一为UTF-8

Transport…可以解决property文件不能正常显示为中文的问题

3. 特殊字符

  • 尽量使用转义字符(\t, \n等),而不是八进制的(\012)或者Unicode转义(\u000a)
  • 非ascii字符,最容易理解,使用unicode字符,比如:μ,不使用转义:\u03bcs

源文件结构

  • license
  • package
  • import
  • 一个主类

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

1. license

2. 包名

不换行(line-wrapped),一行写完

3. import

  • import的时候不使用通配符*
  • 不单独区分jdk的import和其他import,只按照静态引用和非静态引用分块
  • 静态引用、非静态引用之间用空行分开,各自的块中间没有空行

import设置

4. 类

  • 一个文件只有一个top-level类

格式

1. 大括号(braces)

  • If,lese,if else,for,do,while,这些语句块都要用大括号
  • 这些关键字后面的左大括号前面要有空格(没有换行),后面换行,右大括号前后都需要换行(如果右大括号后面有一些特殊的语句块的时候不需要换行,如:else,catch)
  • 如果语句块是空的,可以简写
  // This is acceptable
  void doNothing() {}

  // This is equally acceptable
  void doNothingElse() {
  }
  // This is not acceptable: No concise empty blocks in a multi-block statement
  try {
    doSomething();
  } catch (Exception e) {}

2. 块缩进

4个空格

3. 每行一个声明

  • 变量不要连续声明
  • 每行一个语句(一个分号)

4. 列长限制120

列外情况:

  1. 不可能遵守的这个规则的情况(比如:URL)
  2. package、import
  3. 注释里面的会被拷贝粘贴到命令行里运行的命令

列长限制设置

5. 折行(line-wrapping)

1. 什么时候折行?

究竟应该在哪里折行?随性,一个主要的指导是:最好在语法层面上折行

  1. 如果折行的地方正好是非等号运算符,则在运算符前面折行,包括类似运算符的符号,比如:
    • 点运算符,”.”
    • 泛型,””
  2. 如果折行的地方正好是等号运算符,则在符号后面折行,包括类似等号运算符,比如:
    • foreach的”:”
  3. 方法或者构造方法的名字和左括号(“(“)最好在一行,即方法的左括号后折行
  4. 逗号(“,”)和他前面的部分在一行,逗号后折行
  5. lamda的箭头后面(的”{“)不换行,除非j方法体部分不需要大括号
MyLambda<String, Long, Object> lambda =
    (String label, Long value, Object obj) -> {
        ...
    };

Predicate<String> predicate = str ->
    longExpressionInvolving(str);

2. 有折行时候的缩进

  • 有折行的情况下,每次折行都至少缩进4个空格(相较于第一行)
  • 如果多次缩进是语法上并行的元素,那么可以缩进相同,否则在持续缩进中,每次都要增加4个空格
  • 没有必要为了水平对齐而增加额外的空格

6. 空白

  1. 垂直的空白

    1. 字段、构造方法、成员方法、内部类、静态初始化、实例初始化,这些之间用空行隔开
      1. 成员字段之间不用空行,除非为了逻辑上的分组
      2. enum字段之间用空行隔开
    2. 为了组织代码而进行逻辑分割可以使用空行
    3. 类第一个成员前面不需要空行,最后一个成员后面也不需要空行
  2. 水平空白

    1. 关键字后面的小括号(“(“)之间要有一个空格作为分隔,if,for,catch

    2. 关键字前面的大括号(“}”)之间要有一个空格作为分隔,else, catch

    3. 左大括号(“{“)前面要有一个空格,两个例外:

      1. @SomeAnnotation({a, b}) (no space is used)
      2. String[][] x = {{"foo"}}; (no space is required between {{)
    4. 二元或者三元运算符前后都要有空格,包括类似运算符的符号,如:

      1. 泛型中,<T extends Foo & Bar>
      2. foreach中”:”前后
      3. lamda表达式的”->”前后

      但是不包括:

      1. 点运算符”.”
    5. ,:;后面有空格,还有强转的右括号后面”)”

    6. 行末注释”//”两侧都需要空格,多个是允许的,但不是必须的

    7. 在变量类型和声明之间:List list

    8. 数组初始化的大括号里面,左大括号后面和右大括号前面的空格不是必须的

    new int[] {5, 6} and new int[] { 5, 6 } are both valid

  3. 水平对齐所需要的空白:不需要

增加维护成本

7. 加上分组用的小括号

便于理解运算顺序,而不必记住Java优先级表

8. 特定的一些构造

  1. enum

    如果元素有构造方法或者一般方法的情况,元素之间可以用空行隔开

    private enum Answer {
     YES {
       @Override public String toString() {
         return "yes";
       }
     },
    
     NO,
     MAYBE
    }

​ 如果没有构造方法等可以用下面的方式

private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
  1. 变量声明

    1. 一次声明一个变量,不要出现如int a, b;
    2. 局部变量在必要的还是再声明,保证最小化生命周期
  2. 数组

    1. 数组初始化可以当做一个block,例如:
    new int[] {           new int[] {
     0, 1, 2, 3            0,
    }                       1,
                           2,
    new int[] {             3,
     0, 1,               }
     2, 3
    }                     new int[]
                             {0, 1, 2, 3}
    1. 方括号跟在类型后面,方括号和类型共同组成一个类型,String[] arr,而不是String arr[]
  3. switch语句

    1. case缩进4个空格
    2. 冒号后换行
    3. 有穿透的(case没有break)还是要说明,注释
    4. 保留default,即使没有代码
  4. 注解

    1. 一个注解单独一行
  5. 注释

    多行注释中第一行和最后一行不写注释

    /*
    * This is          // And so           /* Or you can
    * okay.            // is this.          * even do this. */
    */

  6. 修饰词

    Java中修饰词的顺序

    public protected private abstract default static final transient volatile synchronized native strictfp
  7. 数字字面值

    如果是long类型的字面值,最后加”L”,而不是”l”,如:long length = 1000L;

命名

1. 通用的命名规则

仅仅使用ascii字符和数字,少数情况使用下划线(比如:常量命名,大写,多个单词之间使用下划线隔开)

2. 每种标识符对应的命名规则

  1. package:全小写,不使用下划线

  2. class:

    1. 使用首字母大写的驼峰标识
    2. 类名使用名词或者名词短语,接口使用名词或者名词短语,部分情况使用形容词(Readable)
    3. 注解没有指定的规则
    4. 测试类,<被测试的类名>+Test
  3. method:

    1. 方法名首字母小写的驼峰标识
    2. 方法名是动词或者动词短语
    3. 测试方法名称:test+<被测试的方法名>+
  4. constant:

    1. 全大写,单词之间用下划线隔开
    2. 名词或者名词短语
    3. 怎么才算常量:
      1. static final修饰的原始类型、String、不可变的集合
      2. 对象所有可被访问的状态不可变
  5. 非常量字段命名

    1. 首字母小写,驼峰标识
    2. 名词或者名词短语
  6. 形参名

    1. 首字母小写,驼峰标识
    2. public方法的参数名不能只有一个字母
  7. 局部变量命名

    1. 首字母小写的驼峰标识
    2. 局部变量即使是不可变的,也不能按照常量的方法来命名
  8. 泛型参数

    下面两种方式中选一个

    1. 单个大写字母后面跟上数字
    2. 若泛型有上限,则上限类名后面跟上大写的T

3. 驼峰标识的具体方法

怎么将多个单词或者单词短语转换为驼峰标识的命名方法

  1. 将所有的单词或者短语转换为ascii,并且删除中间的任何撇号,如:”Müller’s algorithm”转换为 “Muellers algorithm”。
  2. 将上面得到的划分为单词,使用空格或者标点符号(特别是连字符)作为分界线。如果一个短语有惯常用法,则保留惯常用法,比如:AdWords 转换为Ad Words
  3. 将得到的字符串全部转换为小写,然后将划分后的每一个单词的首字母大写(如果是第一个单词则可能第一个单词的首字母小写)
  4. 然后将字符串连接起来,去掉空格

一些例子:

需要转换的字符串 正确的
“XML HTTP request” XmlHttpRequest
“new customer ID” newCustomerId
“inner stopwatch” innerStopwatch
“supports IPv6 on iOS?” supportsIpv6OnIos
“YouTube importer” YouTubeImporter YoutubeImporter

编程实践

1. 总是写@Override

2. 不忽略任何异常

需要catch异常,并做处理,如果没有必要处理,要用注释说明

3. 使用类名来引用静态成员

4. 不重写Object.finalize

如果非要重写,请阅读并理解《Effective Java》里面避免Finalizer的部分

其他在idea中的设置

换行符

统一为”\n”

设置缩进

缩进

统一为:tab 4 个空格

这里写图片描述

参考

Google Java Style Guide

猜你喜欢

转载自blog.csdn.net/gesanghuakaisunshine/article/details/79797317