Java代码规约

・规约条款级别

重要度 条目
★★★★★ 基本上无条件适用
★★★★ 只要没有特别理由的,适用
★★★ 受项目的方针左右,大概的情况适用
★★ 对全体没有影响的话,可以不适用
介绍一下这样的用法

・代码的5条心得

  • 重视可读性
  • 命名要容易理解
  • Sample不能囫囵吞枣
  • 相同的代码不能写多次
  • (一个方法)只能有1个作用

目录

1.命名规约

1.1 概述

No. 重要度 条目
1.1.1 ★★★ 使用英语
1.1.2 ★★★★★ 不能用大/小写字母来区别标识符的不同

1.2 包

No. 重要度 条目
1.2.1 ★★★★ 包名统一使用小写字母
1.2.2 ★★★ 包名的标识符要有意义
1.2.3 ★★★★ 包名不能缩写
1.2.4 ★★★★ 子包名可以重复
1.2.5 ★★★ 包的详细信息要用package-info.java类来记载

1.3 类・接口

No. 重要度 条目
1.3.1 ★★★ 类名是表达(类的)作用的标识符
1.3.2 ★★★★★ 类名的单词的开头为大写字母
1.3.3 ★★★★ 异常类名的末尾要加上「Exception」
1.3.4 ★★★★ 接口名和实现类名的对应关系要明确
1.3.5 ★★★★ 抽象类名和实现类名的对应关系要明确 (抽象类:AbstractXxxxx/BaseXxxxx/CasioBaseXxxxx)
1.3.6 ★★ 表示能力的接口名要在末尾加「able」

1.4 测试类

No. 重要度 条目
1.4.1 ★★★★ 单体测试作成的时候要使用JUnit等的测试框架
1.4.2 ★★★★ 测试类名的命名:「测试对象类名+Test」/整体测试:「AllTest?」/包测试:「包名+Test」

1.5 方法

No. 重要度 条目
1.5.1 ★★★★★ 方法名要动词开头的合适的标识符
1.5.2 ★★★★ 方法名用大写字母来分割(划分)
1.5.3 ★★★★ 生成对象的方法名用「create+对象名」命名<工厂方法>
1.5.4 ★★★★ (类型)转换方法名用「to+要转换的对象名」或者「convert+要转换的对象名」命名
1.5.5 ★★★★ 返回值是布尔型(boolean)的方法名要明确true/false的状态
1.5.6 ★★★★ (要有用)英语单词反义词的意识

1.5.5

描述 例1 例2
is + 形容词 isEmpty()   isAsleep()
can + 动词 canGet()   canSpeakMultiLanguages()
has + 过去分词 hasChanged()   hasExpired()
三单元动词[+名词] contains()   containsKey()

1.5.6

反义词
send receive
start stop
register unregister
put get
set get(访问类成员的方法名,别的场合,不要轻易使用)

1.6 参数

No. 重要度 条目
1.6.1 ★★★★ 构造函数以及方法的参数名要给予容易理解的标识符

1.7 变量概述

No. 重要度 条目
1.7.1 ★★★★ 常量「static final」、枚举(enum)常量定数是不变的,全部用大写字母、用「_」来间隔
1.7.2 ★★★★ 变量名要表现(变量的)作用。变量名要用大写字母来间隔

1.8 局部变量

No. 重要度 条目
1.8.1 (作用)范围小的变量名省略标识符也可以
1.8.2 ★★★★ for循环的计数器、使用「i」「j」「k」...顺序嵌套

1.9 资源文件★MobileOffice系统追加

No. 重要度 条目
1.9.1 ★★★★★ 画像文件

2.程序设计规约/基础篇

2.1 概述

No. 重要度 条目
2.1.1 ★★★ 目的对象的引用要用接口实现
2.1.2 ★★★★★ 不要使用不推荐的API
2.1.3 ★★★★ 不用的代码不要写
2.1.4 ★★★★★ 要使用适当的访问修饰符来声明(变量、方法、类...)
2.1.5 ★★ 要适当使用final (不被继承的类/不被重写的方法/值不变的变量)
2.1.6 ★★★★★ 要注意基本型和引用型的区别(定义篇)
2.1.7 ★★★★★ 要注意基本型和引用型的区别(参数編)

2.2 度量

No. 重要度 条目
2.2.1 ★★ 1个方法的行数大约在20行以下(最多不超过50行)
2.2.2 ★★ 1个类的行数大约在600行以下(最多不超过1000行)
2.2.3 ★★ 1个类里public方法要在20个以下
2.2.4 ★★ 1个包内类的个数在20个以下(最多不超过30个)
2.2.5 ★★★ 要极力避免相互引用

2.3 格式化

No. 重要度 条目
2.3.1 ★★★★ 代码格式化是作成文件,并用IDE来进行格式化
2.3.2 ★★ return返回值不要用括号
2.3.3 ★★★ 条件判断不要使用「!」
2.3.4 ★★★ 不等号的方向要统一向左("<"、"<=")
2.3.5 ★★★ 条件判断时不要在方法中再调用方法进行判断,使用临时变量
2.3.6 ★★★★ 访问方法(get/set方法)要用IDE自动生成的

2.4 文档注释

No. 重要度 条目
2.4.1 ★★★ 注释(Javadoc)中至少要有author,param,return,throws的记述
2.4.2 ★★★★ 注释应当尽量简洁

2.5 包

No. 重要度 条目
2.5.1 ★★★★ java.lang包不要导入
2.5.2 ★★★★ import语句中不要使用“*”
2.5.3 ★★★★ 用IDE管理import语句

2.6 类

No. 重要度 条目
2.6.1 ★★★★★ 不想被继承的类用final声明
2.6.2 ★★★ 字段要按照public、protected、default、private的顺序声明

2.7 构造函数

No. 重要度 条目
2.7.1 ★★★★★ 没有用public修饰的类,也不能作成有public权限的构造函数
2.7.2 ★★★★★ 构造函数要按照类的特性来作成

2.8 方法

No. 重要度 条目
2.8.1 ★★★★★ 不想被重写的方法要用final修饰
2.8.2 ★★★★ 返回值是数组或Collection的场合不要返回null
2.8.3 ★★★★ 不要破坏public方法的整合性
2.8.4 ★★★★ 一个方法只做一件事
2.8.5 ★★★★ 不要重载参数个数相同的方法
2.8.6 ★★★★★ 重写的方法要给予@Override注解
2.8.7 ★★★★ static方法要用类名来调用

2.9 变量・数组

No. 重要度 条目
2.9.1 ★★★ 不要一次声明多个变量
2.9.2 ★★★★ 不要直接使用文字值,要把文字定义成常量
2.9.3 ★★★★ 数组声明的格式:「类型名[]」
2.9.4 ★★★ 尽可能的使用局部变量
2.9.5 ★★★★★ 常量要用static final来声明
2.9.6 ★★★★ 局部变量和实例(成员)变量要区分使用
2.9.7 ★★★ 成员变量是用private或者protected修饰
2.9.8 ★★★ 不要使用public static final来声明数组
2.9.9 ★★★★ 类变量使用类名调用
2.9.10 ★★★★ 局部变量在使用前声明
2.9.11 ★★★★★ 不要轻易的再使用局部变量・方法的参数

2.10 字符串操作

No. 重要度 条目
2.10.1 ★★★★★ 字符串文字的声明不用new
2.10.2 ★★★★★ 字符串之间比较相同值时使用equals()方法
2.10.3 ★★★★ 字符串的连接用StringBuilder类
2.10.4 ★★★★★ 字符串文字和变量比较时、要使用字符串文字的equals()方法(字符串文字.equals(变量))
2.10.5 ★★★★ 基本型和String转换时,使用下面的变换方法
2.10.6 ★★★★ 系统中存在的符号(\n、\r等)不要使用
1
2
3
    //2.10.5
    String s1 = String.valueOf(123);
    int int1 = Integer.parseInt("123");

2.11 数值

No. 重要度 条目
2.11.1 ★★★★★ 如果想没有误差计算,可以使用BigDecimal类
2.11.2 ★★★★★ 数值的比较要注意精度
2.11.3 ★★★★ 要避免向低精度的基本型转换

2.12 日期

No. 重要度 条目
2.12.1 ★★ Date、Calendar的转换使用long

2.13 Java5以后追加的机能

No. 重要度 条目
2.13.1 ★★★★ 尽可能使用扩张型for语句
2.13.2 ★★★★ 要积极使用Collection减少使用数组
2.13.3 ★★★★ 添加注解的代码容易理解
2.13.4 ★★ 要掌握注解的基本作成方法
2.13.5 ★★★★ List或Map要使用泛型
2.13.6 ★★★★ 不要使用自动装箱、必须进行null转换
2.13.7 ★★ 泛型代入的场合要使用边界通配符
2.13.8 ★★★ 表示一组固定值时使用enum
2.13.9 ★★★ (枚举中)不存在的值不能用调用Enum#valueOf
2.13.10 ★★★ 尽可能不要使用可变长度的参数
2.13.11 ★★★★★ 不推荐使用的类・方法・字段要给予@Deprecated、并且要出示替代的方法
2.13.12 ★★★★★ 使用辅助文字(增补字符)的场合、不要使用String#length()和String#charAt(),要使用 String.codePointCount()和String.codePointAt()
2.13.13 ★★★★★ BigDecimal的格式化要使用はDecimalFormat或BigDecimal#toPlainString
2.13.14 ★★★★★ 多线程程序要使用Java5标准的Executor框架
2.13.15 ★★ 时间的单位转换要使用TimeUnit
2.13.16 ★★★ 是否导入static(类、方法、变量)要统一

3.程序设计规约/技术篇

3.1 继承

No. 重要度 条目
3.1.1 ★★★ 继承前请检讨继承的必要性
3.1.2 ★★★★ 在子类中不要声明与父类的成员变量相同的变量名
3.1.3 ★★★★ 用IDE自动生成equals()方法和hashCode()方法
3.1.4 ★★★ 尽可能的实现toString()方法
3.1.5 ★★★★★ 不要使用Cloneable#clone、使用自己定义的拷贝方法

3.2 实例化

No. 重要度 条目
3.2.1 ★★★★ 注意对象之间的比较方法的不同
3.2.2 ★★★★★ 比较Class对象的场合、不要使用字符串比较
3.2.3 ★★★★ 角色转换处理要用instanceof方法进行判断

3.3 控制结构

No. 重要度 条目
3.3.1 ★★★★ 控制语句(if,else,while,for,do-while)的{}不要省略
3.3.2 ★★★★ 不要使用空的{}块
3.3.3 ★★★ 要灵活运用for和while语句
3.3.4 ★★★ 使用for语句不要改变在迭代过程中循环变量的值
3.3.5 ★★★★ for语句的计数器要从0开始
3.3.6 ★★★ 不要随意使用break或continue
3.3.7 ★★★★★ 简单的数组拷贝时使用既存的clone()等既存方法
3.3.8 ★★★ 循环处理中要最小限度的生成对象
3.3.9 ★★★ 尽量避免在循环里使用if/else语句和switch语句,使用面向对象
3.3.10 ★★★ 循环处理的内部、不要使用try/catch块
3.3.11 ★★ 在if/while的条件中不要使用「=」

3.4 集合

No. 重要度 条目
3.4.1 ★★★★ Java2以后使用集合类

3.5 終了(结束)処理

No. 重要度 条目
3.5.1 ★★★★★ 使用API处理资源(消耗)时,在finally块中处理

3.6 异常処理

No. 重要度 条目
3.6.1 ★★★ catch文で受け取った例外を処理しない場合は適切なエラー情報を付与する
3.6.2 ★★★★★ 例外を再スローするときは、元の例外をスローする例外に入れる
3.6.3 ★★★ Exceptionクラスのオブジェクトを生成してスローしない
3.6.4 ★★★★★ catchブロックでは必ず処理をする
3.6.5 ★★★★★ Error、Throwableクラスを継承しない
3.6.6 ★★★★★ finallyブロックで戻り値に影響がある記述はしない
3.6.7 ★★★★★ finallyから例外をthrowしない

3.7 多线程

No. 重要度 条目
3.7.1 ★★★★ RunnableまたはCallableインタフェースを実装する
3.7.2 ★★★★ 待機中のスレッドを再開するにはnotifyAll()メソッドを利用する
3.7.3 ★★★★ スレッドを切り替えたい場合はThreadクラスのyield()メソッドは利用しない
3.7.4 ★★★★★ synchronizedブロックから「synchronizedブロックのあるメソッドを呼び出さない
3.7.5 ★★★★★ wait()、notify()、notifyAll()メソッドは、synchronizedブロックの中で利用する
3.7.6 ★★★★★ wait()メソッドの後で前題条件を再確認する
3.7.7 ★★★★ 処理の待ち合わせにはポーリングループを利用せずにCountDownLatchなどの既存の仕組みを利用する
3.7.8 ★★★★ 同期化(synchronized)の適用は必要な部分だけにする
3.7.9 ★★★★ マルチスレッド環境下ではConcurrentHashMapやCopyOnWriteArrayListを使う

3.8 过期文件(资料)处理

No. 重要度 条目
3.8.1 ★★★★ finalize()をオーバーライドしない

3.9 其他

No. 重要度 条目
3.9.1 ★★★★ 匿名(とくめい)クラスにメソッド引数を渡す場合、finalを使用する
3.9.2 ★★★★ 複数の値を返すのに、配列やMapを使用しない

4.補足

4.1 命名总括

No. 重要度 条目
4.1.1 ★★★★★ ネーミング総括

4.2 其他总括

No. 重要度 条目
4.2.1 ★★★★★ その他総括