java编码规范
* 1 规范的规范
* 2 代码编码
* 3 代码布局
* 4 Java包命名
* 5 webapps应用目录命名
* 6 Java代码命名
* 7 Java源文件编写约定
*
* 7.1 内容元素顺序
* 7.2 注释
*
* 7.2.1 注释的格式
* 8 其他规范
* 9 自动代码检查
规范的规范
1. 本规范的每一条目必须无二义性,并且可执行。否则作废
2. 本规范的条目分为两个级别:
规则 R- 要求所有项目中的所有成员遵守
建议 S- 建议所有项目中的所有成员遵守
3. 本规范所有的“规则”条目必须被遵守
代码编码
完全采用UTF-8编码
代码布局
R-完全采用maven的默认布局。
src main 源码目录 main/java java源文件 main/resources 其他资源,如checkstyle脚本 main/webapp Web应用目录 main/config 配置文件模版 main/filters 不同profile下的配置 test 测试目录,结构与主源码目录相同 test/java/unit 单元测试 test/java/intergration 集成测试 test/functional 功能测试 test/data 测试数据生成器 target maven编译目录
Java包命名
R-采用按层次分包的策略,层次内按功能划分。
com.zhimei.子项目名 web.controller 控制器controller web.filter 过滤器filter service 业务逻辑接口 service.impl 业务逻辑实现 job quartz等job启动地儿 log 特殊log记录,log分析 stat 数据库统计、网站排名 pojo 实体bean,一般是对应的数据字典 pojo.vo vo对象,一般是是对pojo的再分装 dao 数据操作DAO dao.jdbc jdbc的数据操作 dao.mongo mongodb的数据操作 const 所有常量 util 常用工具类,应该集成到jmind
* R-包名必须全部小写,2个以内单词。
* S-最好为1个单数名词
webapps应用目录命名
R-webapps应用目录
webapp tmp 临时文件 images 图片 scripts 脚本 css 样式 WEB-INF/spring spring配置文件 WEB-INF/jsp jsp WEB-INF/taglib jsp标签库
Java代码命名
* S-类和接口最好为名词
* R-命名类和接口时,需要将所有单词的首字母大写
* R-严格遵守java命名约定,命名尽量不超过15个字符
* R-不允许使用汉语拼音命名
* R-避免使用下划线(静态变量除外),静态变量必须全大写
* R-抽象类必须使用 Abstract 作为类名的前缀
* R-接口的命名不采用首字母为 I 或加上 IF 后缀的命名方式 。例如:IBookDao、BookDaoIF 等
* R-遇到缩写如XML、URL时,仅首字母大写,即loadXmlDocument()而不是loadXMLDocument()
* R-局部变量及输入参数不要与类成员变量同名(get/set方法与构造函数除外)
pojo 参照业务数据字典命名 dao 根据相应资源命名,并以Dao结尾 web.controller 根据相应资源命名,并以Controller结尾 web.filter 根据相应资源命名,并以Filter结尾 service 接口根据相应逻辑命名,并以Service结尾 service.impl 实现根据相应逻辑命名,并以ServiceImpl结尾 job 根据相应逻辑命名,并以Job结尾 const 根据相应逻辑命名,并以Const开头
* S-数据库Column命名尽量考虑可直接作为对象的属性名,如列user_name将被映射为属性userName.
* S-成员变量最好为单数名词
* S-如果是集合或数组,用复数名词
Map pets, 比 Map petMap 要好
* R-任何变量不要用一个字母,尤其是 i,你可以用 index 或者 cursor 来代替。除非循环变量。
Java源文件编写约定内容元素顺序
* S-按照eclipse默认members sort order
静态变量 Static Fields 静态初始化 Static Initializers 静态方法 Static Methods 成员变量 Fields 初始化 Initializers 构造器 Constructors 成员方法 Methods 重载自Object的方法 如toString(), hashCode() 和main方法 类型(内部类) Types(Inner Classes)
* R-修饰符应该按照如下顺序排列:public, protected, private, abstract, static, final, transient, volatile, synchronized, native, strictfp
* R-能private就不要 protected,尽量不要public,最好不要 default
注释
Java程序有两类注释:实现注释(implementation comments)和文档注释(document comments)。Ctrl + /
只是用//不使用/* */
文档注释(被称为"doc comments")是Java独有的,并由/*.../界定。文档注释可以通过javadoc工具转换成HTML文件。
* R-注释必须和代码保持同步
注释的格式
* R-注释中的第一个句子要以(英文)句号、问号或者感叹号结束。Javadoc生成工具会将注释中的第一个句子放在方法汇总表和索引中。
* S-为了在JavaDoc和IDE中能快速链接跳转到相关联的类与方法,尽量多的使用@see xxx.MyClass,@see xx.MyClass#find(String)。
* S-如果注释中有超过一个段落,用<br>或者<p>分隔。
* S-如果注释中有多个章节,用<h2>标签声明每个章节的标题
* S-示例代码以<pre></pre>包裹。
* S-标识(java keyword, class/method/field/argument名,Constants) 以<code></code>包裹。
* S-标识在第一次出现时以{@linkxxx.Myclass}注解以便JavaDoc与IDE中可以链接。
* S-简单的 get/set 方法可以省略注释。
* S-继承的方法可以省略注释,但是被继承方法必须有注释。继承方法可以使用{@inheritDoc}引用被覆写方法的注释
* R-函数内部不要写 JAVA DOC,没意义
* R-代码质量不好但能正常运行,或者还没有实现的代码用//TODO:声明
* R-存在错误隐患的代码用//FIXME:声明
* R-在 if ... else .. 分支上做注释格式应该如下:
// comments for case A
if(xxxx){
//TODO you code here
}
/*
* Multipline comments for case B
*/
else if(xxxxx){
//TODO you code here
}
// comments for default case
else{
//TODO you code here
}
* S-在本函数中抛出的unchecked exception尽量用@throws说明
* S-对于调用复杂的API尽量提供代码示例
* R-public、protected方法及变量必须写注释
其他规范
* R-你的每一次提交,必须都是本地测试通过的
* S-你的每一次提交,最好都是通过 JUnit 测试的
* R-隐藏工具类的构造器,确保只有static方法和变量的类不能被构造实例
* R-变量,参数和返回值定义尽量基于接口而不是具体实现类,如Map map = new HashMap()
* R-提交代码中不能使用System.out.println(),e.printStackTrace(),必须使用logger打印信息。
* R-重新抛出的异常必须保留原来的异常,即throw new NewException("message", e); 而不能写成throw new NewException("message")
* R-在所有异常被捕获且没有重新抛出的地方必须写日志
* R-重载方法必须使用@Override,可避免父类方法改变时导致重载函数失效。
* S-不需要关心的warning信息用@SuppressWarnings("unused"), @SuppressWarnings("unchecked"), @SuppressWarnings("serial") 注释
* S-用double 而不是float,因为float会容易出现小数点后N位的误差。能用int就不用double。
* R-删掉一段代码的贡献,比增加一段代码的贡献要大
* R-避免过度设计,先让代码能工作,然后重构成为优美的代码
* R-每个方法不能超过50行有效代码。
* R-每个类不能超过1000行有效代码。
自动代码检查
使用Eclipse的代码校验功能已经排除了很多问题formatter cleanup。
再配合使用Checkstyle,PMD-CPD,FindBugs三重检查,总共五层的校验涵盖了Java编码大部分的Guide Line