孙宇的技术专栏 大数据/机器学习

Java编码规范

2018-12-15

阅读:


JAVA开发规约

命名规则

  • 命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例: name / __name / $Object / name / name$ / Object$

  • 命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。国际通用的名称,可视同英文。如:youku、taobao。
  • 类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:DAO / DTO 。如:UserDAO, UserDTO, UserEntity。
  • 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从 驼峰形式。如:getSystemConfig。
  • 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。如:SUSPECT_STATUS_FORCE
  • 抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类 命名以它要测试的类的名称开始,以 Test 结尾
  • 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词
  • 枚举类名建议带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。如:CaseOperEnum.ACCESS

常量定义

  • long 或者 Long 初始赋值时,使用大写的 L,不能是小写的 l,小写容易跟数字 1 混 淆,造成误解。
  • 不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护。如:ConfigConsts, ResultMsgConsts。
  • 如果变量值仅在一个范围内变化,且带有名称之外的延伸属性,定义为枚举类。如:案件状态、用户状态。
  • 定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
  • 所有的POJO类属性必须使用包装数据类型。如:Integer, Long。不要使用 int, long。 代码格式
  • 尽量使用 IDE 提供的代码格式化工具。
  • 一行代码不要过长,通常 IDE 可以设置一条纵向的边界线,达到边界线表示代码要换行了。通常单行字符数限制不超过 120 个。
  • IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式, 不要使用 Windows 格式。

注释格式

  • 类、类属性、类方法的注释必须使用 Javadoc 规范,使用/*内容/格式,不要使用 // xxx方式。在 IDE 编辑窗口中,Javadoc 方式会提示相关注释。
  • 方法内部单行注释,在被注释语句上方另起一行,使用//注释
  • 所有的枚举类型字段必须要有注释
  • 待办事宜(TODO)表示需要实现,但目前还未实现的功能。IDE 也会有提示有功能未完成,防止遗忘。

工程结构

  • DAO。Data Access Object。与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
  • DTO。Data Transfer Object。数据传输对象,Service 或 Controller 向外传输的对象。
  • Service/Impl。业务实现层。和底层通过 Entity 进行交互,返回 DTO。
  • Controller。和 WEB 交互层,通过 DTO 进行数据传输,并调用 Service 。

    各层可以再按功能模块划分。如: Dao/Case Dao/Sys Controller/Case Controller/Sys Service/Case Service/Sys 或者先划分模块,再按层级划分。如: Sys/Dao Sys/Controller Sys/Service Case/Dao Case/Controller Case/Service

数据库设计

建表

  • 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint ( 1表示是,0表示否)。
  • 禁用保留字,如 desc、range、match、delayed 等
  • 主键索引名为 pk字段名;唯一索引名为 uk字段名;普通索引名则为 idx字段名。 如:pk 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。
  • 小数类型为 decimal,禁止使用 float 和 double。
  • 如果存储的字符串长度几乎相等,使用 char 定长字符串类型。
  • varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长 度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率。
  • 字段允许适当冗余,以提高查询性能

索引

  • 业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明 显的;另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,必然有脏数据产生。
  • 在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据 实际文本区分度决定索引长度
  • 注意最左原则的索引特性。另外,如果有范围查询,后面的索引会失效。
  • 利用延迟关联或者子查询优化超多分页场景。如: SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id
  • 建组合索引的时候,区分度最高的在最左边。索引的目标就是过滤掉更多的不要的行。比如用户的年龄和性别。可以性别在前,年龄在后。因为性别一次就可以过滤掉一半数据。

SQL语句

  • 不要使用 count(列名)或 count(常量)来替代 count()。count()是 SQL92 定义的 标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
  • count(distinct col) 计算该列除 NULL 之外的不重复行数。
  • 当某一列的值全是 NULL 时,count(col)的返回结果为 0,但 sum(col)的返回结果为 NULL,因此使用 sum()时需注意 NPE 问题。
  • 使用 ISNULL()来判断是否为 NULL 值。 NULL<>NULL的返回结果是NULL,而不是false。 NULL<>1的返回结果是NULL,而不是true。 NULL=NULL的返回结果是NULL,而不是true。
  • 在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句。
  • 不使用外键与级联,外键概念在应用层解决。
  • 不要使用存储过程
  • in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控 制在 1000 个之内。
  • TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 trigger,有可能造成事故

MyBatis

  • 表查询中,不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。
  • xml 配置参数使用:#{},#param# 不要使用${} 此种方式容易出现 SQL 注入。
  • 不要直接拿 HashMap 与 Hashtable 作为查询结果集的输出。自己定义 Dto。
  • 更新时,只更新改动了的字段。可以新建一个 Entity,只给 id 和变动了的字段赋新值然后 save()。

上一篇 Hadoop

下一篇 Zabbix安装使用

评论

文章