本身整理的java编程规范

前言

推荐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

相关文章
相关标签/搜索