阿里Java开发手册
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开发手册的更多相关文章
- 阿里JAVA开发手册零度的思考理解(一)
转载请注明原创出处,谢谢! 缘由 阿里JAVA开发手册已经发表有很长时间了,值得认真研究思考推广 阿里官方的Java代码规范标准,这份开发手册不仅规范了一些开发细节,也提出了很多工程开发的哲学,值得好 ...
- 阿里JAVA开发手册零度的思考理解(二)
转载请注明原创出处,谢谢! 说在前面 人生的大道上默默地走,就必须要有一盏灯亮着为你引导方向!而这盏灯抑或只是一句话,一句鼓励,一个赞美,一次承认,一次认可,一次相识一次交流-- 上篇文章:阿里JAV ...
- 阅读阿里Java开发手册记录
概述 在阅读完阿里Java开发手册(嵩山版)后,发现自己在开发过程中有一些没有按照规范开发的情况,这里将容易忘记的规范记录下来,并且添加自己的理解,一方面方便自己巩固记忆,另一方面希望对其他同学能够提 ...
- JUC学习笔记--从阿里Java开发手册学习线程池的正确创建方法
前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式, 这样的处理方式让写的同学 ...
- 从阿里Java开发手册学习线程池的正确创建方法
前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更 ...
- 【转】线程池体系介绍及从阿里Java开发手册学习线程池的正确创建方法
jdk1.7中java.util.concurrent.Executor线程池体系介绍 java.util.concurrent.Executor : 负责线程的使用与调度的根接口 |–Execut ...
- 阿里java开发手册中命名规约解读之DO/BO/DTO/VO/AO
前言 在阅读<阿里巴巴Java开发手册>时,看到命名规则中有这样一条 虽然知道这些是根据Java对象的角色所分配名称的后缀,但是没有弄清楚分别是什么意思,日常开发中也没有使用到. 网上查找 ...
- 品阿里 Java 开发手册有感
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图, ...
- 读《阿里Java开发手册》总结(1)
一·命名约定 类名使用大驼峰式命名(领域模式相关命名除外:如DAO\VO\DO等). 常量必须全部大写,单词中间用“_”隔开(如MAX_COUNT). 抽象类命名使用Abstract或Base开头.异 ...
- 阿里Java开发手册1.3.0 文字版
版本: 1.3.0 update: 2017.9.25 一.编程规约 (一) 命名风格 1. [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例:_name _na ...
随机推荐
- 使用cookie记录页面跳转次数,然后从最后一级页面跳转回首页面
1.首先,给出cookie设置,获取,删除的操作函数. function setCookie(name,value) { var Days = 30; var ex ...
- 网络编程,socket
1.网络编程 网络: TCP/IP 彼此之间遵守协议和规范!之间才能产生通信! IP: 每个人都有自己的身份证号! 用来标识我们网络中每一台计算机! IP地址= 网络地址 +主机地址 网络地址 :标识 ...
- nodejs 安装失败 ,出现error 2502 和error2503
出现error 2502 和error2503是因为win8的权限问题所导致的,具体说就是要以管理员身份进行安装就可以解决,下面详细来说一下. 1.cmd命令行点击以管理员身份运行. 2.这时候就可以 ...
- xenserver挂载新硬盘
注意:新加硬盘请不要加入raid,否则不认盘 一: 1.1:查看磁盘列表 fdisk -l [root@xenserver zz]# fdisk -l Disk /dev/sdb: 7999.4 GB ...
- LNMP(一)
第二十课LNMP(一) 目录 一.LNMP架构介绍 二.MySQL安装 三.PHP安装 四.Nginx介绍 五.Nginx安装 六.扩展 一.LNMP架构介绍 之前已经学习过LAMP架构,与LAMP相 ...
- Redis在Linux系统下的安装和启动
详情可参见:https://blog.csdn.net/q1035331653/article/details/79077260 开机自启脚本参见:https://www.cnblogs.com/si ...
- 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 ...
- nginx传世经典
nginx的简单介绍与安装nginx的简单介绍 一.Nginx的产生 Nginx是一款高性能的 HTTP 和反向代理服务器,由俄罗斯人Igor Sysoev(伊戈尔·赛索耶夫)为俄罗斯网站Ramble ...
- the principle of redbalck tree
- python学习2:turtle的使用蟒蛇绘制的学习以及自己摸索的等边三角形绘制(跟随mooc学习)
首先先放上蟒蛇的绘制程序 import turtle#引入外部库#def保留字用于 定义函数 def drawSnake(rad,angle,len,neckrad): for i in range( ...