1. 图例:
    1. 强制
    2. 推荐
    3. 参考
    4. 严禁
    5. 不明觉厉
  2. 编码style
    1. 命名
      1. _&
      2. pinyin 中文
      3. 类UpperCamelCase;变量参数:lowerCamelCase; 常量:大写下划线;包名小写单数
      4. Abstract~ Base~ ~Exception ~Test
      5. private boolean isDeleted
      6. OrderFactory;LoginProxy;ResourceObserver;设计模式
      7. get list count save/insert remove/delete update
      8. ~DO ~DTO ~VO ~BO
    2. 代码格式
      1. 括号后换行
      2. 空格:保留字和括号间;二目三目运算符左右
      3. 四个空格缩进
      4. 注释//以后有一个空格
      5. 换行:/r/n的unix风格;120字符换行;.号换行;,号后换行;
      6. text file encoding =UTF-8
      7. 单空格分隔
    3. 并发
      1. 获取单利对象需要保证线程安全,其中的方法也要保证线程安全;
      2. 创建线程时候指定有意义的线程名字
      3. 线程资源必须通过线程池提供
      4. 线程池不允许使用Executors创建,而是通过ThreadPoolExecutor方式
      5. SimpleDateFormat线程不安全类;定义为static要加锁; 使用DataUtils工具类代替
      6. 锁的范围尽量小;尽量无锁数据结构;锁区块;锁方法体;锁对象;锁类;
      7. 多个资源,数据库表,对象同时加锁时,保持一致的加锁顺序;避免死锁;
      8. 加锁点:应用层加锁;缓存加锁;数据库层乐观锁;
      9. 多线程定时任务使用SchedualedExecutorService代替Timer
    4. 控制
      1. switch语句case有break;default;
      2. 严禁单行语句;if (condition) stattements;
      3. if if 优于 if else if
      4. if 条件判断内不要执行复杂语句;将复杂的逻辑判断结果赋值给一个有意义的布尔变量名
      5. 变量定义声明,获取连接,不必要的try-catch移动到循环结果外面;
      6. 入参保护;参数校验
    5. 注释
      1. javadoc注释:类,类属性,类方法
      2. 内部注释// 方法上方一行
      3. 类注释添加创建者和创建日期
    6. 其他
      1. 正则进行预编译,有效加快匹配速度;不在方法体内进行compile工作
      2. 后台输送给页面的变量必须加 $!{var} ——中间的感叹号。
      3. Math.random()的取零异常;nextInt() nextLong()
      4. Instant 类代替时间;System.currentTimeMillis();System.nanoTime();
      5. 暂时注释的代码用///写明注释的理由;
      6. 任何数据结构的构造和初始化,都应该指定大小;避免结构数据无限增长吃光内存;
    7. oop规约
      1. @override/@Deprecated
      2. 相同参数类型,相同业务含义才使用可变参数; 可变参数避免使用Object;避免使用可变参数;
      3. POJO类属性必须使用包装数据类型
      4. tostring();init();
      5. 增加属性不要修改serialVersionUID字段;避免反序列化失败; 不兼容升级的话,避免反序列化混乱,应该修改serialVersionUID
      6. 方法顺序:公用方法>私有方法>getter setter方法
      7. setter中不增加业务逻辑
      8. 类和方法的访问控制从严
    8. 集合处理
      1. hashCode和equals相伴相生
      2. ArrayList.subList()返回的是ArrayList的内部类Sublist, 只是ArrayList的一个视图,对于SubList的操作会反映到源列表上;
      3. 集合转数组 toArray(T[] array)
      4. 数组转集合Arrays.asList()后,不能对集合进行修改
      5. foreach循环内部进行元素的remove/add操作;使用Iterator操作;并发操作需加锁
      6. Comparator接口实现必须考虑相等情况
      7. 集合初始化的时候指定初始大小;initialCapacity = (存储个数/负载因子)+1; 负载因子默认0.75;即超过75%容量值就进行一次扩容; HashMap默认初始大小16; ArrayList默认初始大小10; HashSet默认初始大小16;
      8. Map的遍历使用entrySet遍历;Map.foreach方法
      9. Map 类集合 K / V 能不能存储 null 值的情况
  3. 异常日志
    1. 异常处理
      1. IOBE,NPE应通过预检查规避
      2. 异常不应来做流程控制
      3. 精确try-catch
      4. 捕获异常必须处理,否则往上抛
      5. 事务代码里头的try-catch手动回滚
      6. try-catch-finally内关闭对象和资源;try-with-resources
      7. finally内不能return
      8. 防止NPE是调用者的责任
      9. 抛出的异常应有业务含义;DAOException;ServiceException
    2. 日志
      1. 日志使用SLF4J中的API
      2. 日志文件保存时间》=15天;有些异常具备以周围频次发生的特点;
      3. 日志文件命名:appName_logType_logName.log
      4. 日志输出使用占位符或者条件输出!
        1. logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
      5. 日志应避免重复打印,additivity =false
      6. 日志记录内容:案发现场信息;堆栈信息
  4. 单元测试
    1. 单元测试原则AIR:Automatic;Independent;Repeatable
    2. 全程assert检查
    3. 单元测试之间不能相互调用
    4. 单元测试代码原则:BCDE:Border;Correct;Design;Error
    5. 数据库的查询更新删除操作,应使用程序插入或者导入数据方式准备数据;
    6. 数据库单元测试可以设定自动回滚机制 或者单元测试数据有明确前后缀标记;
    7. 对业务代码的要求: 1.简单构造方法 2.少依赖 3.少条件语句 4.少全局变量,静态方法
    8. 目录/src/test/java
    9. 新增代码及时增加单元测试;
    10. 测试目标: 语句覆盖率70%; 核心模块语句覆盖率100%;
  5. 安全规约
    1. 权限控制校验;
    2. 敏感数据脱敏
    3. sql参数使用参数绑定 禁止字符串拼接sql访问数据库;
    4. 请求参数有效性验证: 1.pageSize 2.order by 3.重定向 4.反序列化注入 5.正则输入源拒绝服务ReDos
    5. html页面要进行安全过滤,正确转义的用户数据;
    6. csrf安全过滤
    7. 短信,邮件,电话,下单,支付: 防重限制 数量限制 疲劳度限制 验证码
    8. 用户生成内容的防刷,违禁词过滤
  6. mysql数据库
    1. 建表
      1. boolean值命名:is_xxx unsigned tinyint
      2. 表名,字段名小写字母数字(linux mysql 区分大小写) 表名使用单数名词 表名:业务名_表作业
      3. 保留字禁用
      4. pk_xxx;uk_xxx;idx_xxx
      5. 小数类型使用decimal,禁止使用float,double
      6. 定长字符串 char
      7. varchar 变长字符串,不预先分配存储空间;长度<5000 过长的使用text,分开成单独的表;
      8. 字段必备: id;必须为主键;unsigned bigint,单表时候自增,步长1 gmt_create,gmt_modified;date_time
      9. 单表行数超过500w,或单表容量超过2G,才进行分库分表;
      10. 合适的字符存储长度;unsigned tinyint;unsigned smallint;
    2. 索引
      1. 业务上具有唯一特性的字段,建立唯一索引;
      2. 禁止三表以上join join字段类型绝对一致
      3. varchar字段建立索引指定索引长度;20长度就已经有90%的区分度了;
      4. 严禁左模糊匹配和全模糊匹配;
      5. order by 利用索引的有序性; where a =? and b =? order by c; 索引: a _ b _ c
      6. 延迟关联或者子查询优化超多分页场景;
      7. explain 级别限制range ref consts
      8. 建立组合索引,区分度高的前面;大小于号和等号混合时候,等号字段在前面;
    3. SQL
      1. count(*)会统计null的行
      2. count(distinct col) 计算该列除了null之外的不重复行数
      3. count(col)返回0;sum(col)返回null;注意NPE
      4. count(0)直接返回;不执行后面的分页语句;
      5. 不能使用外键和级联;一切外键概念在应用层解决;
      6. 禁止使用存储过程;存储过程不好调试和移植
      7. in 操作 尽量避免;集合数量不超过1000
    4. ORM
      1. 查询字段明确,严禁*
      2. 配置隐射关系,不能省,字段级别
      3. mybatis:#{} #param#;避免sql注入
      4. ibatis自带的queryForList不推荐使用;
      5. 返回值类型不可以为hashMap和hashTable,返回值类型不可控制、
      6. 更新数据记录时候更新gmt_modified字段
      7. 更新操作;查询操作;字段粒度控制;越少越好;
      8. @Transational不要滥用
  7. 工程结构
    1. 应用分层
    2. 分层领域模型