1.1 命名风格

(1)常量命名全部大写,单词间用下划线隔开。

(2)抽象类命名以Abstract或Base开头;异常类命名以Exception结尾;测试类命名以它要测试的类名开始,以Test结尾。

(3)类型与中括号之间无空格定义数组(例:String[] args)。

(4)Boolean类型的变量不要加is前缀(例:Boolean isDeleted,它的方法名称也是isDeleted(),会造成部分框架解析失败)。

(5)包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词(例:com.pajk.util),统一使用单数形式。

(6)接口类中的方法和属性不要加任何修饰符(public也不要加,例:void commit()),尽量不要在接口里定义变量,如果一定要定义,必须是与接口方法相关的,并且是整个应用的基础常量。

(7)枚举类成员名称需要全部大写,单词间用下划线隔开(枚举就是特殊的常量类,且构造方法被默认强制为私有)。

1.2 常量定义

(1)不允许任何魔法值(即没有预先定义的常量)出现在代码中(例:String key = "pajk")。

(2)long或者Long初始化时,使用大写的L,因为小写的容易跟数字1混淆。

1.3 代码格式

(1)相同参数类型,相同业务含义,才可以使用可变参数。

1.4 OOP规约

(1)不能使用过时的类或方法,过时的接口必须加@Deprecated注解,并清晰的说明新接口是什么。

(2)Object的equals方法容易抛NPE异常,JDK7建议使用java.util.Objects#equlas方法。

(3)所有包装类型对象之间的比较,全部使用equals方法,不要用==判断。

(4)POJO类属性必须使用包装数据类型,RPC方法的返回值和参数必须使用包装数据类型(防止NPE异常),所有的局部变量使用基本数据类型。

(5)在定义DO/DTO/VO等POJO类时,不要设定任何属性默认值。

(6)POJO类必须写toString方法。IDE中工具 source-generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。

(7)类内推荐的方法定义顺序:public > private > getter / setter 方法。

(8)getter / setter 方法中不要增加业务逻辑,否则会增加排查问题的难度。

(9)对象的clone方法是浅拷贝,若想实现深拷贝,需要重写clone方法来实现属性对象的拷贝。

(10)对任何类、方法、参数和变量,严控访问范围,过于宽泛的访问范围,不利于模块解耦(例:如果是一个private方法,想删除很简单,public则要考虑很多东西)。

1.5 集合处理

(1)只要重写equlas,就必须重写hashCode。

(2)String重写了hashCode和equals,所以很方便用来作为Map的key使用。

(3)subList返回的是ArrayList的内部类,只是ArrayList的一个视图,并不能转为ArrayList。

(4)集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size()。

(5)数组转集合的方法为Arrays.asList,体现的是适配器模式,后台的数据结构仍是数组,所以用该方法转换后的集合不能修改内部元素。

(6)remove集合元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。

(7)HashMap的key和value可以为空,ConcurrentHashMap则不行。

(8)有序性(遍历的结果是按某种比较规则排列的)和稳定性(每次遍历的元素次序是一定的)的比较:ArrayList是order/unsort,HashMap是unorder/unsort,TreeSet是order/sort。

1.6 并发处理

(1)获取单例对象需要保证线程安全,其中的方法也要保证线程安全。

(2)线程资源必须通过线程池提供。

(3)线程池不允许使用Executors创建,而是通过ThreadPoolExecutor的方式创建。

(4)SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。

(5)如果是JDK8,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat。

(6)高并发场景中,同步调用要考虑锁对性能的损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。

(7)如果线程一需要对A、B、C依次全部加锁后才可以进行更新操作,那么线程而的加锁顺序也必须是A、B、C,否则可能出现死锁。

(8)要么在应用层加锁,要么在缓存层加锁,要么在数据库层使用乐观锁。如果每次访问冲突概率小于20%,推荐使用乐观锁,否则使用悲观锁。乐观锁的重试次数不得小于3次。

1.7 控制语句

(1)在一个swtich块内,都必须包含一个default语句并且放在最后,即使它什么代码也没有。

(2)在高并发场景中,避免使用“等于”判断作为中断或退出的条件,应使用大于或者小于的区间判断来代替,因为如果并发控制没有处理好,容易产生等值判断被“击穿”的情况。

(3)为了日后方便维护代码,if-else应避免使用,就算使用,请勿超过3层,超过的话可以使用卫语句来代替(卫语句:就是把复杂的条件表达式拆分成多个条件表达式为真时,立刻从方法体返回给调用方,例:if(isBusy()))

阿里Java开发手册的更多相关文章

  1. 阿里JAVA开发手册零度的思考理解(一)

    转载请注明原创出处,谢谢! 缘由 阿里JAVA开发手册已经发表有很长时间了,值得认真研究思考推广 阿里官方的Java代码规范标准,这份开发手册不仅规范了一些开发细节,也提出了很多工程开发的哲学,值得好 ...

  2. 阿里JAVA开发手册零度的思考理解(二)

    转载请注明原创出处,谢谢! 说在前面 人生的大道上默默地走,就必须要有一盏灯亮着为你引导方向!而这盏灯抑或只是一句话,一句鼓励,一个赞美,一次承认,一次认可,一次相识一次交流-- 上篇文章:阿里JAV ...

  3. 阅读阿里Java开发手册记录

    概述 在阅读完阿里Java开发手册(嵩山版)后,发现自己在开发过程中有一些没有按照规范开发的情况,这里将容易忘记的规范记录下来,并且添加自己的理解,一方面方便自己巩固记忆,另一方面希望对其他同学能够提 ...

  4. JUC学习笔记--从阿里Java开发手册学习线程池的正确创建方法

    前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式, 这样的处理方式让写的同学 ...

  5. 从阿里Java开发手册学习线程池的正确创建方法

    前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更 ...

  6. 【转】线程池体系介绍及从阿里Java开发手册学习线程池的正确创建方法

    jdk1.7中java.util.concurrent.Executor线程池体系介绍 java.util.concurrent.Executor : 负责线程的使用与调度的根接口  |–Execut ...

  7. 阿里java开发手册中命名规约解读之DO/BO/DTO/VO/AO

    前言 在阅读<阿里巴巴Java开发手册>时,看到命名规则中有这样一条 虽然知道这些是根据Java对象的角色所分配名称的后缀,但是没有弄清楚分别是什么意思,日常开发中也没有使用到. 网上查找 ...

  8. 品阿里 Java 开发手册有感

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图, ...

  9. 读《阿里Java开发手册》总结(1)

    一·命名约定 类名使用大驼峰式命名(领域模式相关命名除外:如DAO\VO\DO等). 常量必须全部大写,单词中间用“_”隔开(如MAX_COUNT). 抽象类命名使用Abstract或Base开头.异 ...

  10. 阿里Java开发手册1.3.0 文字版

    版本: 1.3.0 update: 2017.9.25 一.编程规约 (一) 命名风格 1. [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例:_name _na ...

随机推荐

  1. JavaScript基础知识点总结

    JavaScript----js 全栈课程-------全栈工程师 前端:信息展示,普通用户浏览---前端工程师(html+css:静态页面 js:页面的交互效果) 后台:信息管理,管理员,数据库-- ...

  2. [poj P1475] Pushing Boxes

    [poj P1475] Pushing Boxes Time Limit: 2000MS   Memory Limit: 131072K   Special Judge Description Ima ...

  3. 封装一个函数,在ThinkPHP中一定程度上取代success和error

    1.下载jq2.下载layer3.根据自己的项目配置,将上述2文件放到样式目录中4.在Application/Common/function.php中添加如下代码function msg($msg,$ ...

  4. vue-router进阶-3-过渡动效

    template: <transition> <router-view></router-view> </transition> 单个路由的过渡 con ...

  5. python基础——列表

    Python列表脚本操作符 列表对 + 和 * 的操作符与字符串相似.+ 号用于组合列表,* 号用于重复列表. 如下所示: Python 表达式 结果 描述 len([1, 2, 3]) 3 长度 [ ...

  6. java接口中的继承

    java.util.concurrent包下的 public interface BlockingDeque<E> extends BlockingQueue<E>, Dequ ...

  7. SONObjetc和String Map Bean互转,JSONArray和String List互转

    import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; i ...

  8. C# 流水号生成器开发

    前言 本文将使用一个Nuget公开的组件技术来实现一个流水号生成器,提供了一些简单的API,来方便的实现一个通用的流水号. 在visual studio 中的NuGet管理器中可以下载安装,也可以直接 ...

  9. Python全栈之路----函数----返回值

    函数外部的代码想要获取函数的执行结果,就可以在函数里用return语句,把结果返回. def stu_register(name,age,course='PY',country='CN'): prin ...

  10. ViewpagerHandler

    import android.os.AsyncTask; import android.os.Handler; import android.os.Message; import android.su ...