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. PAT 1054 The Dominant Color

    1054 The Dominant Color (20 分)   Behind the scenes in the computer's memory, color is always talked ...

  2. MapRdeuce&Yarn的工作机制(YarnChild是什么)

    MapRdeuce&Yarn的工作机制 一幅图解决你所有的困惑 那天在集群中跑一个MapReduce的程序时,在机器上jps了一下发现了每台机器中有好多个YarnChild.困惑什么时Yarn ...

  3. Java多线程——Condition条件

    简介 Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signa ...

  4. 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)

    原文见:http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/ from:ht ...

  5. Dao层的sql语句

    2018-08-12     21:33:43 反思:在数据库执行的时候,sql语句是正确的,复制到方法中,执行出错   因为把限定条件改为?时,把左括号删掉了,sql语句报错 改正:一定要确保sql ...

  6. Java框架部分---面试题

    说说Spring? Spring的核心是控制反转.依赖注入,Aop(面向切面)相当于把每个bean与bean之间的关系交给第 三方容器进行管理. 说SpringIOC.SpringAOP? Sprin ...

  7. L330 Black hole picture captured for first time in space ‘breakthrough’

    Black hole picture captured for first time in space ‘breakthrough’ Astronomers have captured the fir ...

  8. quartz Cron表达式解读

    CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表. CronT ...

  9. Visual Studio AI 离线模型训练(Windows10)

    一.序 环境搭建:[查看] samples-for-ai项目下载:[下载],两个版本,一个2018年6月15日前,一个2018年6月15日-16日版本(当前最新版本). 在环境搭建过程中,通过git ...

  10. node day1 login

    https://blog.csdn.net/weixin_33901641/article/details/85967847 vue之node.js的简单介绍 http://nodejs.cn/ ht ...