推荐Google的Java编码规范英文版:html
http://google-styleguide.googlecode.com/svn/trunk/javaguide.htmljava
虽然这篇文章的英文很简单,可是最近发现有人翻译了这篇文章,因此专门推荐一下:算法
http://hawstein.com/posts/google-java-style.html数据库
1、命名规范微信
已经被使用的常量,不要从新定义数据结构
约定俗成的常量含义,不要从新定义。app
努力避免硬编码。ide
每一个模块,建议有独立的常量类。svn
方法名都以lowerCamelCase风格编写函数
类名都以UpperCamelCase风格编写
参数名以lowerCamelCase风格编写
局部变量名以lowerCamelCase风格编写,比起其它类型的名称,局部变量名能够有更为宽松的缩写。
虽然缩写更宽松,但仍是要避免用单字符进行命名,除了临时变量和循环变量。
即便局部变量是final和不可改变的,也不该该把它示为常量,天然也不能用常量的规则去命名它。
2、函数/方法
public 函数(方法),对象参数 必需要处理参数为null的状况,
private 函数,对象参数 能够不用处理参数为null的状况(依状况而定)
方法名都以lowerCamelCase 开头单词小写后面驼峰风格编写
方法长度不超过50行
3、嵌套层级不要超过3层。
for,while,if ,switch 等。
方法中条件不成立直接return,再也不向下执行
如: public int xxx (String userId, String password, String email){ if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(email) ||StringUtils.isEmpty(password)){ return null; } UserEntity ue = EntityProxy.OBJ.get(userId, UserEntity.class); if(ue == null){ return null; } ……... }
避免前套层次过深,建议不超过三层
4、代码结构
1垂直
如下状况须要使用一个空行:
类内连续的成员之间:字段,构造函数,方法,嵌套类,静态初始化块,实例初始化块。
例外:两个连续字段之间的空行是可选的,用于字段的空行主要用来对字段进行逻辑分组。
在函数体内,语句的逻辑分组间使用空行。
类内的第一个成员前或最后一个成员后的空行是可选的(既不鼓励也不反对这样作,视我的喜爱而定)。
要知足本文档中其余节的空行要求。
多个连续的空行是容许的,但没有必要这样作(咱们也不鼓励这样作)。
一个类的整体行数尽可能控制在400行左右(不超过一千行)。
5、资源处理
EntityTransaction tranx = null; try { // 获取数据库事务 tranx = em.getTransaction(); // 开始事务过程 if(!tranx.isActive()){ tranx.begin(); } // 保存实体 Query query = em.createNamedQuery(jpqlName); if(params!=null && !params.isEmpty()){ params.forEach((k,v)->{ query.setParameter(k, v); }); } query.executeUpdate(); // 提交事务 tranx.commit(); } catch (Exception ex) { // 记录错误日志 DaoLog.LOG.error("删除对象异常"); DaoLog.LOG.error(ex.getMessage(), ex); if(tranx != null){ tranx.rollback(); } return false; }finally{ if(tranx !=null && tranx.isActive()){ tranx.commit(); } em.close();//注意 用完必定要释放 }
6、异常处理
比较底层的处理单元,建议抛出异常。
业务处理模块,处理异常的同时,异常必需要加日志!最好有finally处理。
方法返回结果,不要使用异常方式。
7、相同的代码快,不要处处出现或者重复出现!
相同代码提取处理,让代码可重用。
8、注释
一、源文件注释
源文件注释采用 /* …… /,在每一个源文件的头部要有必要的注释信息,包括:文件名;文件编号;版本号;做者;建立时间;文件描述包括本文件历史修改记录等。中文注释模版:
/**
文 件 名 :
CopyRright (c) 2015-xxxx:
文件编号:
创 建 人:
日 期:
修 改 人:
日 期:
描 述:
版 本 号:
*/
二、类(模块)注释:
类(模块)注释采用 /* …… /,在每一个类(模块)的头部要有必要的注释信息,包括:工程名;类(模块)编号;命名空间;类能够运行的JDK版本;版本号;
做者;建立时间;类(模块)功能描述(如功能、主要算法、内部各部分之间的关系、该类与其类的关系等,必要时还要有一些如特别的软硬件要求等说明);
主要函数或过程清单及本类(模块)历史修改记录等。
三、接口注释:
接口注释采用 /* …… /,在知足类注释的基础之上,接口注释应该包含描述接口的目的、它应如何被使用以及如何不被使用,块标记部分必须注明做者和版本。
在接口注释清楚的前提下对应的实现类能够不加注释。
四、构造函数注释:
构造函数注释采用 /* …… /,描述部分注明构造函数的做用,不必定有块标记部分。
五、函数注释:
函数注释采用 /* ……/,在每一个函数或者过程的前面要有必要的注释信息,包括:函数或过程名称;功能描述;
输入、输出及返回值说明;调用关系及被调用关系说明等。函数注释里面能够不出现版本号(@version)。
六、方法注释:
方法注释采用 /* …… /,普通成员方法要求说明完成什么功能,参数含义是什么且返回值什么;另外方法的建立时间必须注释清楚,为未来的维护和阅读提供宝贵线索。
七、方法内部注释:
控制结构,代码作了些什么以及为何这样作,处理顺序等,特别是复杂的逻辑处理部分,要尽量的给出详细的注释。
八、全局变量注释:
要有较详细的注释,包括对其功能、取值范围、哪些函数或者过程存取以及存取时注意事项等的说明。
九、局部(中间)变量注释:
主要变量必须有注释,无特别意义的状况下能够不加注释。
十、实参/参数注释:
参数含义、及其它任何约束或前提条件。
10、if else 条件含义要明确
如: if (isOk) { //isOK 如何 return Response.status(200).entity(resp.getData()).build(); } else { return Response.status(200).entity(resp.getErrorInfo()).build(); }
11、逻辑控制,不要瀑布流!
尽可能把条件不知足的状况写在某个逻辑块的前面(好比方法的最前面),让不知足条件的状况快速失败,让代码整理结构清晰,可读。
12、巧用构造函数构造者builder模式:
构造方法:UserDetailInfo userinfo = new UserDetailInfo(user); builder方式: Map<String, Object> oparams = ImmutableMap.<String, Object> builder() .put("appid", ConfigUtil.APPID)// 服务号的应用号 .put("body", WeixinConstant.PRODUCT_BODY)// 商品描述 .put("mch_id", ConfigUtil.MCH_ID)// 商户号 ? .put("nonce_str", PayCommonUtil.CreateNoncestr())// 16随机字符串(大小写字母加数字) .put("out_trade_no", orderId)// 商品订单号 .put("total_fee", "1")// 银行币种 .put("spbill_create_ip", ip)// IP地址 .put("notify_url", ConfigUtil.NOTIFY_URL) // 微信回调地址 .put("trade_type", "APP")// 支付类型 app .build();
十3、数据结构与业务处理(算法)分开
如: MVC MVVM 均可以参考
十4、关键业务添加日志记录
LoggerUtils.loginLogger.info(String.format("xx用户[%s] at %s 登录xxx app", sb.toString(),DateUtils.getDateTime()));
最后啰嗦一句 :写代码一个类写完了 去掉无效的引用,也就是import的时候。
补充:养成好习惯,祝你们写好代码,迎娶白富美,走上人生巅峰!
thx