Java编程规范

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

一.    编写背景

本文档的编写从简,绝大多数内容以条款或者表格形式列出,不做过多的补充说明,代码格式规范遵循eclipse的默认编码规范要求.

二.    适用范围

后台开发人员

总则

规范制定总则

•    简单,易执行

命名总体原则

1.    名字含义要明确,做到见名知义,如: User,Role, UserManager
2.    尽量使用英文名字作为变量名,如果要使用中文,请写上备注.
如:var hbType = null;// hb是中文“货币”的首字母缩写.

3.    采用大小写混合形式命名,提高名字的可读性
正确:UserManager
错误: usermanager
4.    尽量少用缩写,但如果一定要使用,就要谨慎地使用。
应该保留一个标准缩写的列表,并且在使用时保持一致。例如,想对单词“number”采用缩写,使用 num 这种格式,并且只使用这一种形式.注意:要维护缩写词汇列表.
5.    所有文件的名称都是大写字母开头,大小写混合, 如UserList.jsp
6.    所有目录的名称都是小写字母开头,大小写混合, 如userType
7.    变量名不能以下划线开头,如“_account”,”_userName”是不允许的,因为下划线开头的变量可能被OWK平台做为保留字占用.
8.    避免使用相似或者仅在大小写上有区别的名字

例如,不应同时使用变量名 persistentObject 和 persistentObjects,以及 anSqlDatabase 和 anSQLDatabase。


代码注释原则

1.    注释应该简单清晰,避免使用装饰性内容,也就是说,不要使用象广告横幅那样的注释语句。
2.    代码注释的目的是要使代码更易于被同时参与程序设计的开发人员以及其他后继开发人员理解。
3.    先写注释,后写代码。
写代码注释的最好方法是在写代码之前就写注释。这使你在写代码之前可以想想代码的功能和运行。而且这样确保不会遗漏注释。(如果程序的逻辑稍微复杂点的话,这样做非常有效)

4.    注释信息不仅要包括代码的功能,还应给出原因。
例如,下面例 1 中的代码显示金额在 $1,000 以上(包括 $1,000)的定单可给予 5% 的折扣。为什么要这样做呢?难道有一个商业法则规定大额定单可以得到折扣吗?这种给大额定单的特殊是有时限的呢,还是一直都这样?最初的程序设计者是否只是由于慷慨大度才这样做呢?除非它们在某个地方(或者是在源代码本身,或者是在一个外部文档里)被注释出来,否则你不可能知道这些。
if (grandTotal >= 1000.00)
{
grandTotal = grandTotal * 0.95;
}

三    规范内容

命名

包结构定义=${包单元}[.${包单元}]*

说明:

     1:一个包是由一个或多个构造单元组成,各构造单元之间以点号”.”隔开

      2:一个包单元由一个或多个词组成
      3:包单元应该是名词
•    业务系统的包结构是com.cmb.zct.${业务系统名字}.${模块名}
•    包名全部小写,如:com.cmb.zct.tx.OA.common是不允许的.但有种情况下允许出现大写字母,就是当包单元是由多个词组成时.如: com.cmb.zct.tx.oa.userType.

•    使用完全的英文描述符,所有单词的第一个字母要大写,并且单词中大小写混合。
•    类名是名词或名词词组.如 LogManager
•    工具类以Util结尾 . 如FileUtil,StrUtil
•    异常类以Exception结尾.如RootDirNotExistsException
•    抽象类名以Abstract开头 AbstractGenerator
•    工厂类以Factory结尾,如 ConnFactory

•    接口同类名,大小写混合..

方法

•    成员函数的命名应采用完整的英文描述符,大小写混合使用:所有中间单词的第一个字母大写。成员函数名称的第一个单词常常采用一个有强烈动作色彩的动词。首个单词小写。如:getUserInfo, removeEquipment   
参数变量
  以 小写p开头
       如
       public void sendMessage(String pMessage){
         ...............
       }
注意:javabean 的参数变量不带p。
常量名
采用完整的英文大写单词在词与词之间用下划线连接。
MAX_VALUE,DEFAULT_START_DATE
目录名
     同包名,小写字母开头,如果有多个单词构成,则第2个以后的单词以大写字母开头。如user, userType目录
文件名
  同类名命名规则,大写字母开头,大小写混合。如:EquipmentList.jsp
  模块相关文件命名约束,为了方便说明,${MODEL_NAME}代表实际模块的名称,那各文件的名字必须满足下表格式要求.
文件                                   格式                                     举例
业务组件接口    I${MODEL_NAME}Facade.java    IUserFacade.java
服务组件接口    I${MODEL_NAME}Service.java    IUserService.java
业务组件实现类    ${MODEL_NAME}FacadeImpl.java    UserFacadeImpl.java
服务组件实现类    ${MODEL_NAME}ServiceImpl.java    IUserServiceImpl.java
测试类    ${MODEL_NAME}ServiceTest.java    UserServiceTest.java

        
        

模块

配置文件    Spring配置文件    ${MODEL_NAME}.spring.xml    User.spring.xml
     Sqlmap配置    ${MODEL_NAME}.sqlmap.xml    User.sqlmap.xml
    种子文件    ${MODEL_NAME}Service.seed.xml    UserService.seed.xml
            
            

JAVA源文件结构



/*
*Copyright (c) 2007-2008
*/

package com.owk.sgtz.util;

import java.io.Serializable;
import java.util.List;

/**
 *
 * @author HO074337
 *
 */
public class Test extends Object implements Serializable{
    
    /* 变量注释 */
    public static final int PKG_HEADER_MAX_LEN = 20;
    /* */
    protected static int i = 0;
    int j = 0;
    private int k;


    
    /**
     *方法注释
     * @param i
     */
    public Test(int i){
        
    }
    
    /***
     * 方法注释
     *
     */
    public void printInfo(){
        
    }
    
}

说明:
•    首行是版权信息
•    空一行,定义包名
•    空一行,声明要import的类
•    空一行,编写类的注释
•    紧挨着,定义类
•    空一行,定义变量
•    空一行,定义构造函数
•    空一行,定义方法


注释

概念

Java程序有两类注释:

    实现注释(implementation comments)和文档注释(document comments)。实现注释是那些在C++中见过的,使用/*...*/和//界定的注释。

    文档注释(被称为"doc comments")是Java独有的,并由/**...*/界定。文档注释可以通过javadoc工具转换成HTML文件.本规范只对文档注释进行约束,程序注释由开发人员自行把握,但应该遵循代码注释原则

类的注释
/**
 *
 * @author HO074337
 * @version 1.0
* 创建日期:20071010
 *
* 功能描述:
 *   类的功能描述,阐述这个类的主要功能
 *   
 * 已知的问题:
 *   如果一个类有任何突出的问题,应说明出来,让其他的开发者了解这个类的缺点/难点。
 *   此外,还应注明为什么不解决问题的原因
 *   
 * 维护历史:
 *   列出日期、类的作者和修改概要。这样做的目的是让进行维护的程序员了解过去曾对一个
 *   类所做的修改,是谁做了什么样的修改
 *   如:
 *   huangyh 20071010
 *    增加了getUserById(String)方法,使用该方法可以获取用户对象
 *    
 *   zhangw  20071008
 *    将private方法 removeUser() 设置为public,因为在 XX模块需要使用.
 *    
 */

变量注释
    /**
     * 通讯报头的最大长度
     */
    public static final int PKG_HEADER_MAX_LEN = 20;
注意:所有public ,protected或默认的变量,都必须采用文档注释符号,因为这些注释信息需要
导出到文档。
Private变量,可以用单行注释,多行注释,或者文档注释,不做限制


变量描述要说明变量的用途.如果是枚举性质的变量,请注释清楚有效值范围.

方法注释

    /**
     * 功能描述:
     *   方法提供什么功能.
     *   
     * 已知问题:
     *   如果方法的实现存在某些问题时,需要在这进行说明,以便后续维护人员
     *   把问题解决,或者规避.
     *
     * 使用示例:
     *   简单的函数调用示例
     *   
     * @param pMsg 参数名称 参数描述
     * @return    返回值说明
     * @exception 异常说明
     */


任务标注

在注释中使用TODO来标识某些未实现(bogus)的但可以工作(works)的内容。用FIXME来标识某些假的和错误的内容。
   如:      /**
         * TODO: XXX有效性检验.
         */
   /**
* FIXME: 这段代码存在严重的性能问题,系统正式发布前一定要修复
*/
这些标住信息在eclipse的Tasks视图中可以看
 
异常
1.    所有业务异常(帐号不存在,密码错误等)都必须直接或者间接从com.cmb.zct.common.exception. BusinessException派生
2.    所有系统异常(主键冲突,SQL语句本身句法错误)都必须直接或者间接从com.cmb.zct.common.exception.SysException 派生

日志

1.    不准使用System.out.println/System.err.println 输出调试信息
2.    统一使用common log 输出日志
3.    日志对象的定义

private final Log log = LogFactory.getLog( BaseJDBCDAO.class );
或者
private final static Log log = LogFactory.getLog( BaseJDBCDAO.class );


编码方式

所以牵涉到编码方式的地方,全部统一使用utf-8编码
编程惯例
1.    类成员变量不设置为public 的,除非是static final 常量
2.    该用类名访问静态方法而不是对象. 如: StringUtil.trim
3.    将工具类的构造函数设置为private,避免client端构造对象来调用工具方法
4.    位于for循环中作为计数器值的数字常量,除了-1,0和1之外,不应被直接写入代码.应该先定义常量变量
5.    一般而言,在含有多种运算符的表达式中使用圆括号来避免运算符优先级问题,是个好方法。即使运算符的优先级对你而言可能很清楚,但对其他人未必如此。你不能假设别的程序员和你一样清楚运算符的优先级。
if (a == b && c == d) // AVOID!
if ((a == b) && (c == d)) // RIGHT
6.    对于返回List/Set/Map的方法,当集合中不存在记录时,返回空的List/Set/Map,而不是null. 在java.util.Collections类中存在3个对应的空对象 EMPTY_LIST, EMPTY_SET和EMPTY_Map
7.    session,application变量的key值,不能只是个简单的名字,为了避免冲突,通常需要给key值带上包名。
如:
  USER_DATA_KEY是用来保存登陆用户信息的
private static final String PACKAGE_NAME = Constants.class.getName();    
    public static final String USER_DATA_KEY = PACKAGE_NAME + ".userData";
排版/其它
1.    代码风格统一采用Eclipse默认的风格,请选定代码后使用快捷键“CTRL+SHIFT+F”格式化代码;
2.    每行只包含一条语句.不允许在一行中出现这种情况:argv++; argc--;
3.    所有if,for,while,do while等中的语句块都应该包含在{}里. 这样便于添加语句而无需担心由于忘了加括号而引入bug
4.    单行长度尽量避免一行的长度超过80个字符
5.    推荐一行一个声明,因为这样以利于写注释
6.    避免声明的局部变量覆盖上一级声明的变量。例如,不要在内部代码块中声明相同的变量名
7.    方法内的局部变量和方法的第一条语句之间使用空行间隔
8.    块注释(参见"5.1.1")或单行注释(参见"5.1.2")之前插入空行间隔
9.    一个紧跟着括号的关键字应该被空格分开.如: while ( true ){}
10.    参数列表的逗号后面要加空格。如:getBranch(String branchCode, String subbranchCode);
11.    for语句中的表达式应该被空格分开 for(int I=0; I<10; I++)
12.    一元操作符和操作数之间不因该加空格,比如:负号("-")、自增("++")和自减("--")
13.    强制转型后应该跟一个空格myMethod((byte) aNum, (Object) x);
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
第1章 简介 1 1.1 示例程序 4 1.2 符号 4 1.3 预定义类和接口的关系 4 1.4 参考文献 5 第2章 语法 7 2.1 与环境无关的语法 7 2.2 词法语法 7 2.3 语义语法 7 2.4 语法符号 8 第3章 词法结构 11 3.1 unicode 11 3.2 词法转换 12 3.3 unicode转义符 12 3.4 行终止符 13 3.5 输入元素和标记 14 3.6 空白 15 .3.7 注释 15 3.8 标识符 16 3.9 关键字 17 3.10 字面值 18 3.11 分隔符 26 3.12 运算符 26 第4章 类型、值和变量 27 4.1 各种类型和值 28 4.2 基本类型和值 28 4.3 引用类型和值 35 4.4 类型变量 39 4.5 参数化类型 41 4.6 类型擦除 45 4.7 可具体化的类型 45 4.8 原生类型 46 4.9 交集类型 49 4.10 子类型化 49 4.11 在何处使用类型 51 4.12 变量 53 第5章 转换和提升 60 5.1 转换的种类 62 5.2 赋值转换 71 5.3 方法调用转换 76 5.4 字符串转换 77 5.5 强制转换 77 5.6 数值提升 82 第6章 名称 85 6.1 声明 86 6.2 名称和标识符 86 6.3 声明的作用域 88 6.4 成员和继承 92 6.5 确定名称的含义 95 6.6 访问控制 104 6.7 完全限定的名称和规范名称 109 6.8 命名约定 110 第7章 包 116 7.1 包成员 116 7.2 包的主机支持 117 7.3 编译单元 119 7.4 包声明 119 7.5 导入声明 121 7.6 顶级类型声明 126 7.7 惟一的包名称 128 第8章 类 130 8.1 类声明 131 8.2 类成员 143 8.3 字段声明 147 8.4 方法声明 159 8.5 成员类型声明 180 8.6 实例初始化语句 181 8.7 静态初始化语句 181 8.8 构造函数声明 182 8.9 枚举 189 第9章 接口 197 9.1 接口声明 197 9.2 接口成员 200 9.3 字段(常量)声明 201 9.4 抽象方法声明 203 9.5 成员类型声明 205 9.6 注释类型 206 9.7 注释 213 第10章 数组 219 10.1 数组类型 219 10.2 数组变量 220 10.3 数组创建 221 10.4 数组访问 221 10.5 数组:一个简单的示例 221 10.6 数组初始化语句 222 10.7 数组成员 223 10.8 数组的class对象 224 10.9 字符的数组不是一个string 224 10.10 数组存储异常 224 第11章 异常 226 11.1 异常的起因 227 11.2 异常的编译时检查 227 11.3 异常处理 229 11.4 异常的示例.. 231 11.5 异常层次结构 232 第12章 执行 234 12.1 虚拟机启动 234 12.2 加载类和接口 236 12.3 链接类和接口 237 12.4 初始化类和接口 239 12.5 创建新的类实例 243 12.6 类实例的终结 246 12.7 卸载类和接口 249 12.8 程序退出 250 第13章 二进制兼容性 251 13.1 二进制的形式 252 13.2 二进制兼容性是什么,不是什么 255 13.3 包的演变 255 13.4 类的演变 256 13.5 接口的演变 269 第14章 块和语句 271 14.1 语句的正常结束和突然结束 271 14.2 块 272 14.3 本地类声明 273 14.4 局部变量声明语句 274 14.5 语句 278 14.6 空语句 279 14.7 标签语句 280 14.8 表达式语句 280 14.9 if语句 281 14.10 assert语句 282 14.11 switch语句 285 14.12 while语句 288 14.13 do语句 289 14.14 for语句 291 14.15 break语句 294 14.16 continue语句 296 14.17 return语句 297 14.18 throw语句 298 14.19 synchronized语句 299 14.20 try语句 300 14.21 不可到达语句 305 第15章 表达式 309 15.1 计算、表示和结果 309 15.2 变量作为值 310 15.3 表达式的类型 310 15.4 精确浮点数表达式 310 15.5 表达式和运行时检查 311 15.6 计算的正常和突然结束 312 15.7 求值顺序 313 15.8 主表达式 317 15.9 类实例创建表达式 320 15.10 数组创建表达式 325 15.11 字段访问表达式 329 15.12 内存调用表达式 332 15.13 数组访问表达式 362 15.14 后缀表达式 365 15.15 一元运算符 366 15.16 强制转换表达式 369 15.17 乘法运算符 370 15.18 加运算符 373 15.19 移位运算符 377 15.20 关系运算符 378 15.21 相等运算符 380 15.22 位和逻辑运算符 382 15.23 条件与运算符&& 383 15.24 条件或运算符
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值