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

源文件基本设置

1. 文件名

驼峰标识,.java结尾html

2. 编码

统一为UTF-8java

Transport...能够解决property文件不能正常显示为中文的问题git

3. 特殊字符

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

源文件结构

  • license
  • package
  • import
  • 一个主类

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

1. license

2. 包名

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

3. import

  • import的时候不使用通配符*
  • 不单独区分jdk的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

列外状况:app

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

5. 折行(line-wrapping)

1. 何时折行?

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

  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. 水平空白ui

    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 XMLHTTPRequest
"new customer ID" newCustomerId newCustomerID
"inner stopwatch" innerStopwatch innerStopWatch
"supports IPv6 on iOS?" supportsIpv6OnIos supportsIPv6OnIOS
"YouTube importer" YouTubeImporter YoutubeImporter

编程实践

1. 老是写@Override

2. 不忽略任何异常

须要catch异常,并作处理,若是没有必要处理,要用注释说明

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

4. 不重写Object.finalize

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

其余在idea中的设置

换行符

统一为"\n"

缩进

统一为:tab 4 个空格

参考

Google Java Style Guide

相关文章
相关标签/搜索