学习编码规范

编码规范

编程规约学习

命名风格

参考阿里巴巴Java开发手册

oop规约

  1. 外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方法产生影

解释:主要是说给SDK开发的,或者说是对中间件的人说的,二次封装的方法要给别人进行调用,那么随意修改方法的签名就会影响调用者的使用。
2. 循环体内,字符串的连接方式,强制使用StringBulider的append方法进行扩展。

理解: 之前理解的是如果用String进行字符串连加的操作,这样会导致每一次都回new一个String,这里的说明说每一次会new出一个StringBuilder对象。自己看了源码,也没有找到相关的答案,先mark一下吧。

集合处理

  1. ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException 异常:java.util.RandomAccessSubList cannot be cast to java.util.ArrayList ; 说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是 ArrayList的一个视图,对于SubList子列表的所有操作最终会反映到原列表上。

理解: subList是ArrayList的一个方法,返回值可以使用List进行接收,返回的是 ArrayList 的内部类,如果此时对subList进行add操作,那么原ArrayList的值也会发生变化。
2. 在 subList 场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增 加、删除均产生ConcurrentModificationException 异常。

理解:多线程不锁的话很容易出现这个问题,单线程的for循环里也不能对本集合操作,也会造成这个异常,造成的原因就是List的操作数前后大小不相等,比如说遍历的时候操作数只有5,结果你在循环里有添加了一个元素,操作数就变成6了,等到下一次循环的时候操数不相等,就会报异常。(还是需要注意,subList只是ArrayList的一个视图,修改他修改了本质,同样的,修改了本质,视图也会发生改变)
3. 【强制】泛型通配符

控制语句

  1. 【推荐】接口入参保护,这种场景常见的是用于做批量操作的接口。
  2. 【参考】方法中需要进行参数校验的场景:(尽可能早的发现由于参数的原因会导致的错误,一般RPC过来的接口和前台API接口都需要参数校验)
    1) 调用频次低的方法。
    2) 执行时间开销很大的方法,参数校验时间几乎可以忽略不计,但如果因为参数错误导致中间执行回退,或者错误,那得不偿失。
    3) 需要极高稳定性和可用性的方法。
    4) 对外提供的开放接口,不管是RPC/API/HTTP接口。
    5) 敏感权限入口。

其他

  1. 【强制】velocity 调用 POJO 类的属性时,建议直接使用属性名取值即可,模板引擎会自动按 规范调用 POJO 的 getXxx(),如果是 boolean 基本数据类型变量(boolean 命名不需要加 is 前缀),会自动调用 isXxx()方法。

理解: 当时看的就是不知道velocity是个什么东西。。。Velocity是一个基于Java的模板引擎。它允许任何人使用简单而强大的模板语言来引用Java代码中定义的对象。以后好好研究一下。
2. 【强制】获取当前毫秒数 System.currentTimeMillis(); 而不是 new Date().getTime();(多多注意)
说明:如果想获取更加精确的纳秒级时间值,用 System.nanoTime()。在 JDK8 中,针对统计时间等场景,推荐使用Instant 类。

JDK8中的Instant类还没有怎么用过,以后慢慢熟悉吧。

异常处理

  1. 【推荐】在代码中使用“抛异常”还是“返回错误码”,对于公司外的http/api开放接口必须使用“错误码”;而应用内部推荐异常抛出;跨应用间RPC调用优先考虑使用Result方式,封装isSuccess、“错误码”、“错误简短信息”。

关于RPC方法返回方式使用Result方式的理由:1 使用抛异常的返回方式,调用方如果没有捕获到就会产生运行错误。2 如果不加栈信息,在频繁调用出错的情况下,数据序列化和传输的性能损耗也是问题。

MySQl数据库

索引规约

针对索引,之前开发的时候还是很少有用到,但以后对于大数据量的操作估计要用的比较多了
1. 【强制】在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。

     说明: 索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为 20 的索引,区分度会高达 90%以上,可以使用 count(distinct left(列名, 索引长度))/count(*)的区分度来确定。
2. 【推荐】如果有 order by 的场景,请注意利用索引的有序性。 order by 最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。
     正例: where a=? and b=? order by c; 索引: a_b_c
     反例: 索引中有范围查找,那么索引有序性无法利用,如: WHERE a>10 ORDER BY b; 索引a_b 无法排序。

  1. 【推荐】利用覆盖索引来进行查询操作, 避免回表。说明: 如果一本书需要知道第 11 章是什么标题,会翻开第 11 章对应的那一页吗?目录浏览一下就好,这个目录就是起到覆盖索引的作用。
         正例: 能够建立索引的种类:主键索引、唯一索引、普通索引,而覆盖索引是一种查询的一种效果,用 explain 的结果, extra 列会出现: using index

  2. 【推荐】利用延迟关联或者子查询优化超多分页场景。
         说明: MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回N 行,那当 offset 特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行 SQL 改写。
         正例: 先快速定位需要获取的 id 段,然后再关联:SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id

  3. 【推荐】SQL 性能优化的目标:至少要达到 range 级别, 要求是 ref 级别, 如果可以是 consts最好。
         说明:
          1) consts 单表中最多只有一个匹配行(主键或者唯一索引) ,在优化阶段即可读取到数据。
          2) ref 指的是使用普通的索引(normal index) 。
          3) range 对索引进行范围检索。
         反例: explain 表的结果, type=index,索引物理文件全扫描,速度非常慢,这个 index 级别比较 range 还低,与全表扫描是小巫见大巫。

explain是优化sql的一个好工具,sql优化(http://dbaplus.cn/news-10-80-1.html

  1. 防止因字段类型不同造成的隐式转换,导致索引失败
  2. 抵制唯一索引。认为业务的唯一性一律需要在应用层通过“先查后插”方式解决

SQL语句

  1. 【强制】不允许直接拿HashMap与HashTable作为查询结果集的输出。
  2. 中的compareValue是与属性值对比的常量,一般是数字,表示相等时带上此条件。表示不为空且不为null时执行;表示不为null值时执行

工程结构

应用分层

image
默认上层依赖下层,箭头关系表示可以直接依赖。

服务器

1.【推荐】调大服务器所支持的最大文件句柄数 (File Descriptor ,简写为 fd) 。
说明:主流操作系统的设计是将 TCP / UDP 连接采用与文件一样的方式去管理,即一个连接对
应于一个 fd 。主流的 linux 服务器默认所支持最大 fd 数量为 1024,当并发连接数很大时很
容易因为 fd 不足而出现“ open too many files ”错误,导致新的连接无法建立。 建议将 linux
服务器所支持的最大句柄数调高数倍 ( 与服务器的内存数量相关 ) 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值