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 | ★★★★★ | その他総括 |