Java开发规范

© Young 2015-07-23 21:34
Welcome to My GitHub

命名相关

1. 常量:一个或多个英文单词的组合,所有字母均大写,单词之间以“_”分隔。
public static final String NEWBIEWEB_SITE = "http://newbieweb.me";
2. 成员变量:一个或多个英文单词的组合,第一个单词的首字母小写,其他单词首字母均大写,其余所有字母均小写。
public String newbieWebSite = "http://newbieweb.me";
3. 局部变量:一个或多个英文单词的组合,一般采用匈牙利命名法。
前缀 含义 实例
c 表示char类型 cSex
i 表示int类型 iAge
by 表示byte类型 byTip
s 表示short类型 sHeight
l 表示long类型 lNum
f 表示float类型 fPrice
d 表示double类型 dMoney
str 表示String类型 strName
b 表示boolean类型 bFlag
arr 表示数组类型 arrAddress
col 表示Collection类型 colUser
lst 表示List类型 lstUser
map 表示Map类型 mapUser
dt 表示Date类型 dtStartTime
sb 表示StringBuffer类型 sbIds
obj 表示Object类型 objUser

PS:上述列表只是举个例子并未完全列出所有可能的情况,其他情况大家可以以此类推;而且自定义类型的局部变量名称可以不采用上述规则。

char cSex = 'm';
int iAge = 23;
byte byTip = 0;
short sHeight = 123;
long lNum = 123;
float fPrice = 32.21;
double dMoney = 12.12;
String strName = "liy";
boolean bFlag = true;
String[] arrAddress = {"beijing","shanghai","shenzhen"};
Collection<User> colUser = new ArrayList<User>();
List<User> lstUser = new ArrayList<User>();
Map<String,User> mapUser = new HashMap<String,User>();
Date dtStartTime = new Date();
StringBuffer sbIds = new StringBuffer();
Object objUser = new User();
User user  = new User();//假定User类和Article类都是自定义类型
Article article  = new Article();</code></pre>
4. 常用类型:采用约定俗成的命名。
Connection conn = null;
ResultSet rs = null;
PreparedStatement pstmt = null;
Statement stmt = null;
5. 方法:一般的方法名采用动宾结构形式的名称,多个单词之间不要带其它符号,第一个单词的首字母小写,其他单词首字母均大写,其余所有字母均小写。
public String showSimpleArticle();
6. 其它:如果你的项目具有明确分层结构,那么类以及接口的命名应该体现层次的差异,比如:UserVO、UserDAO、UserBean、UserService等。

注释相关

1. 类注释:所有类及接口头要写类注释(包含说明、作者、创建日期、修改日期等),如果注释的内容比较长则需要加<br/>
/**
 * 用户表user数据访问层
 * @author : young
 * @addDate : 2014-4-22
 * @editDate 2015-07-02
 */
@Component
public class UserDao {
    //do something ...
}
2. 方法注释:方法要写方法头注释,其中返回值(@return)、参数(@param)、异常(@throws)等需要说明含义,如果注释的内容比较长则需要加<br/>
/**
 * 根据条件查询后台菜单
 * @param menu 查询条件
 * @param isPage 是否分页
 * @return
 * @throws Exception
 */
public List<Menu> selectMenus(Menu menu,boolean isPage) throws Exception;
3. 代码块注释:对代码块的注释,注释语句放在代码块之上,用”//”进行注释,如果注释语句本身超过一行,则用”/**/”进行注释。
4. 代码行注释:对某一行代码的注释,注释语句放在代码行的后面,用”//”进行注释。
//连接池整理
WsOutbound oldWs = SimpleWebSocket.this.mapConn.get(strIpAddress);
SimpleWebSocket.this.mapConn.put(strIpAddress, this.getWsOutbound());//更新新连接,并且一个ip只能保持一个连接
if(iIndexNo==0){
    if(oldWs!=null){
        try{
            oldWs.close(0, null);//关闭旧连接节约资源
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

格式相关

1. 缩进:四个空格符或者一个制表符。
2. 行代码长度:尽量不要太长。
3. 大括号:保证统一即可。
4. 空行:代码中可以适当加入空行,但是不要出现太多。

经验相关

1. Java实体类中的属性为基本类型时,最好重新定义为基本类型对应的包装类型。
public class User{
    /** 编号 */
    private Long id;//不应该写成long
    /** 姓名 */
    private String name;
}

因为如果定义成基本类型那么这个类在实例化时候就算没给某些基本类型的成员属性赋值,该成员属性依然会有默认值(int 默认值为0,boolean默认值为false等),这样会对一些运用了Java反射机制的框架或者你自己开发的涉及Java反射机制的工具类产生影响;

另外使用包装类型的时候有一点要注意的,判断两个实例的包装类型的成员属性的值是否相等时需要转换为该包装类型对应的基本类型(至少转换一个,也就是让比较的两边至少有一个是基本类型)。

2. 在循环遍历中使用集合中的当前元素时,应该使用临时变量保存,然后在后边的处理中使用该临时变量即可。

阐述本条代码规范之前,先来说说反面的例子吧,如下图所示:

由于没有良好的代码规范上述调试过程会出现遍历异常的情况,也就是说while循环中遍历器本来只向后移动一位,但是你监控表达式it.next()后会导致一次循环中遍历器向后移动两位,从而出现不符合预期的情况,影响你对调试结果的判断;
另外之所以会出现这种情况我觉得是MyEclipse中(或者类似Eclipse的编译环境),Debug模式中的Expression功能的原理应该和拦截器又或许是动态代理的原理(cglib,直接修改二进制代码)类似,总之是会对正在运行的程序带来影响,所以使用的时候应该注意。

发表评论

电子邮件地址不会被公开。 必填项已用*标注