源文件基本设置
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, 只按照静态引用和非静态引用分块
静态引用非静态引用之间用空行分开, 各自的块中间没有空行
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
列外情况:
不可能遵守的这个规则的情况(比如: URL)
packageimport
注释里面的会被拷贝粘贴到命令行里运行的命令
5. 折行(line-wrapping)
1. 什么时候折行?
究竟应该在哪里折行? 随性, 一个主要的指导是: 最好在语法层面上折行
如果折行的地方正好是非等号运算符, 则在运算符前面折行, 包括类似运算符的符号, 比如:
点运算符,"."
泛型,"
如果折行的地方正好是等号运算符, 则在符号后面折行, 包括类似等号运算符, 比如:
foreach 的 ":"
方法或者构造方法的名字和左括号 ("(") 最好在一行, 即方法的左括号后折行
逗号 (",") 和他前面的部分在一行, 逗号后折行
lamda 的箭头后面 (的 "{") 不换行, 除非 j 方法体部分不需要大括号
- MyLambda<String, Long, Object> lambda =
- (String label, Long value, Object obj) -> {
- ...
- };
- Predicate<String> predicate = str ->
- longExpressionInvolving(str);
2. 有折行时候的缩进
有折行的情况下, 每次折行都至少缩进 4 个空格(相较于第一行)
如果多次缩进是语法上并行的元素, 那么可以缩进相同, 否则在持续缩进中, 每次都要增加 4 个空格
没有必要为了水平对齐而增加额外的空格
6. 空白
垂直的空白
字段构造方法成员方法内部类静态初始化实例初始化, 这些之间用空行隔开
成员字段之间不用空行, 除非为了逻辑上的分组
enum 字段之间用空行隔开
为了组织代码而进行逻辑分割可以使用空行
类第一个成员前面不需要空行, 最后一个成员后面也不需要空行
水平空白
关键字后面的小括号 ("(") 之间要有一个空格作为分隔, if,for,catch
关键字前面的大括号 ("}") 之间要有一个空格作为分隔, else, catch
左大括号 ("{") 前面要有一个空格, 两个例外:
- @SomeAnnotation({a, b})
- (no space is used)
- String[][] x = {{"foo"}};
- (no space is required between {{)
二元或者三元运算符前后都要有空格, 包括类似运算符的符号, 如:
泛型中,
<T extends Foo & Bar>
foreach 中 ":" 前后
lamda 表达式的 "->" 前后
但是不包括:
点运算符 "."
在,:; 后面有空格, 还有强转的右括号后面 ")"
行末注释 "//" 两侧都需要空格, 多个是允许的, 但不是必须的
在变量类型和声明之间: List
数组初始化的大括号里面, 左大括号后面和右大括号前面的空格不是必须的
new int[] {5, 6} and new int[] { 5, 6 } are both valid
水平对齐所需要的空白: 不需要
增加维护成本
7. 加上分组用的小括号
便于理解运算顺序, 而不必记住 Java 优先级表
8. 特定的一些构造
enum
如果元素有构造方法或者一般方法的情况, 元素之间可以用空行隔开
- ```java
- private enum Answer {
- YES {
- @Override public String toString() {
- return "yes";
- }
- },
- NO, MAYBE
- }
- ```
如果没有构造方法等可以用下面的方式
private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
变量声明
一次声明一个变量, 不要出现如 int a, b;
局部变量在必要的还是再声明, 保证最小化生命周期
数组
数组初始化可以当做一个 block, 例如:
java new int[] { new int[] { 0, 1, 2, 3 0, } 1, 2, new int[] { 3, 0, 1, } 2, 3 } new int[] {0, 1, 2, 3}
方括号跟在类型后面, 方括号和类型共同组成一个类型, String[] arr, 而不是 String arr[]
switch 语句
case 缩进 4 个空格
冒号后换行
有穿透的 (case 没有 break) 还是要说明, 注释
保留 default, 即使没有代码
注解
一个注解单独一行
注释
多行注释中第一行和最后一行不写注释
java /* * This is // And so /* Or you can * okay. // is this. * even do this. */*/
修饰词
Java 中修饰词的顺序
java public protected private abstract default static final transient volatile synchronized native strictfp
数字字面值
如果是 long 类型的字面值, 最后加 "L", 而不是 "l", 如:
long length = 1000L;
命名
1. 通用的命名规则
仅仅使用 ascii 字符和数字, 少数情况使用下划线(比如: 常量命名, 大写, 多个单词之间使用下划线隔开)
2. 每种标识符对应的命名规则
package: 全小写, 不使用下划线
class:
使用首字母大写的驼峰标识
类名使用名词或者名词短语, 接口使用名词或者名词短语, 部分情况使用形容词(Readable)
注解没有指定的规则
测试类,<被测试的类名>+Test
method:
方法名首字母小写的驼峰标识
方法名是动词或者动词短语
测试方法名称: test+<被测试的方法名>+
constant:
全大写, 单词之间用下划线隔开
名词或者名词短语
怎么才算常量:
static final 修饰的原始类型 String 不可变的集合
对象所有可被访问的状态不可变
非常量字段命名
首字母小写, 驼峰标识
名词或者名词短语
形参名
首字母小写, 驼峰标识
public 方法的参数名不能只有一个字母
局部变量命名
首字母小写的驼峰标识
局部变量即使是不可变的, 也不能按照常量的方法来命名
泛型参数
下面两种方式中选一个
单个大写字母后面跟上数字
若泛型有上限, 则上限类名后面跟上大写的 T
3. 驼峰标识的具体方法
怎么将多个单词或者单词短语转换为驼峰标识的命名方法
将所有的单词或者短语转换为 ascii, 并且删除中间的任何撇号, 如:"Müller's algorithm"转换为"Muellers algorithm"
将上面得到的划分为单词, 使用空格或者标点符号 (特别是连字符) 作为分界线如果一个短语有惯常用法, 则保留惯常用法, 比如: AdWords 转换为 Ad Words
将得到的字符串全部转换为小写, 然后将划分后的每一个单词的首字母大写(如果是第一个单词则可能第一个单词的首字母小写)
然后将字符串连接起来, 去掉空格
一些例子:
需要转换的字符串 | 正确的 | 不正确的 |
"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 https://google.github.io/styleguide/javaguide.html
来源: https://www.cnblogs.com/sunshine-2015/p/8699198.html