阿里巴巴Java开发手册学习记录

阿里巴巴Java开发手册学习记录

一、编程规约

1.命名风格

  • 严禁使用英文 + 拼音混合使用

  • 类名应所有单词的首字母大写,除了(UserDO,XxxDTO, XxxPo

    等)

  • 常量的命名应该是大写 + 单词间用下划线连接

  • 抽象类的应以Abstract/Base开头

  • POJO类中的布尔变量,都不要以is前缀,否则某些框架解析会引起序列化错误, 。 (之前看一个文章就是因为XxxDTO方法的命名为isXxxXxx(),导致方法被错误的序列化,造成了线上事故,文章:https://mp.weixin.qq.com/s/994BAkKPEeBz_gs_6LN2DQ)

  • 如果模块、接口、类、方法使用了设计模式,应体现在命名中

  • 领域模型命名规约

    • 数据对象:xxxDO, xxx为数据表名
    • 数据传输对象:xxxDTO, xxx为业务领域相关
    • 展示对象,xxxVO,xxx为网页名称
    • POJO是DO/DTO/BO/VO的统称,禁止使用xxxPOJO
  • 如果变量值仅在一个固定范围内变化用enum声明

2.代码格式

  • 单行字符限制不超过120各,超出要换行:
    • 第二行相对于第一行缩进4各空格,之后行不再缩进
    • 运算符与下文一起换行(例如:“.”)
    • 方法调用中多个参数,在逗号后换行
  • 可以插入一个空行将不同的逻辑、语义、谈业务分隔开,提高可读性。

3.OOP规约

  • 所有重写父类的方法都需要加@Override,可以判断是否重写成功
  • 接口过时必须加@Deprecated,并说明新接口的位置。
  • 不使用过时的类和方法
  • 在使用equals时,应使用常量或者确定有值的对象的equals的方法
  • 所有的POJO类属性必须使用包装类型,RPC方法的返回值和参数必须使用包装类型
  • 如果完全不兼容升级,避免反序列化混乱,要修改serialVersionUID
  • 构造方法中不加任何业务逻辑
  • 禁止在POJO类中同时存在一个属性的isXxx()和getXxx()方法(疑问)
  • 类内方法定义顺序:公有方法>私有>getter/setter方法
  • 对象的clone方法默认时浅拷贝,若想要实现深拷贝,需要重写clone方法。
  • 工具类不允许有public和default构造方法

4.集合处理

  • 只要重写equals,就必须重写hashcode
  • 使用set存储自定义对象时,自定义对象需要重写equals、hashcode 方法
  • 在使用sublist时,对原集合的增加或删除,均会导致子列表遍历、增加、删除产生并发修改异常。
  • 在进行list的toArray(size)方法转数组时,应该传入list.size()作为参数这样返回的就是当前类型的数组,如果直接1使用无参toArray方法时,返回值是Object类型的数组。
  • Arrays.asList()把数组转换成集合时,不可以使用add等修改方法,否则抛异常。
  • PECS(Producer Extends Consumer Super)原则:频繁往外读取内容的,适合用。经常往里插入的,适合用
  • 不用在foreach里进行元素的remove/add操作,remove可以使用iterator方式,如果并发操作需要对Iterator对象加锁。(这里虽说foreach本质也是迭代器实现,但是反编译以后会发现最后删除时是通过list直接remove,而迭代器删除的是通过迭代器的remove方法删除的

5.并发处理

  • 获取单例对象时,需要保证线程安全
  • 应该使用ThreadPoolExecutor创建线程池
  • SimpleDateFormat线程不安全,如果定义为static,必须加锁,也可以使用DateUtils
  • 如果是 JDK8 的应用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter 代替 SimpleDateFormat
  • 对多个资源(表、对象)同时加锁时,应该保持加锁的一致性,避免死锁。
  • 并发修改同一记录时,避免更新丢失,可以在应用层、缓存加锁,或者数据库层使用乐观锁。(如果每次访问冲突概率小于20%,推荐使用乐观锁,否则使用悲观锁。乐观锁的重试次数不得小于3 次。)
  • 避免多个线程使用一个Random(Random或Math.random),会导致性能下降,可以使用ThreadLocalRandom
  • 在多线程场景下计数,volatile无法应对多些的场景,一般我们会选择AtomicInteger,但是在竞争比较激烈的场景下,可以使用LongAdder性能更好(空间换时间,内部将数组分段计数最后求和,但是只使用计数场景下)。
  • ThreadLocal 建议使用static修饰,只需要创建一次,一个线程内的所有对象都已操作这个变量。

持续更新…

你可能感兴趣的:(java,学习)