阿里巴巴Java编程规范考试

今天在阿里云官网把阿里巴巴Java编程规范认证考试考过了, 写下这篇文章总结一下考试中需要注意的知识点, 主体内容还是要直接看规范:

  • 编程规约
  • 异常日志
  • 单元测试
  • 安全规约
  • MySQL数据库
  • 工程结构

编程规约

  1. 类名使用UpperCamelCase风格, 但以下情形例外: DO / BO / DTO / VO / AO / PO 等, 如UserDO等。在阿里巴巴Java编程规范中POJO(Plain Ordinary Java Object)专指只有setter / getter / toString 的简单类, 包括DO / BO / DTO / VO 等, 禁止命名成xxxPOJO。
  2. 定义DO / DTO / VO 等POJO类时, 不要设定任何属性默认值。
  3. 定义数组: 类型与中括号紧挨相连来定义, 如int[] arrayDemo, 不能使用“String args[]”这种方式。
  4. 包名统一使用小写, 单数形式; 类名如果有复数含义,可以使用复数形式;例如:包名com.alibaba.ai.util, l类名MessageUtils。
  5. 任何二目、三目运算符的左右两边都需要加一个空格, 注意一目运算++ 是不需要加空格的。
  6. 单行字符数限制不超过120个, 单个方法的总行数不超过80行。
  7. 序列化类新增属性时, 请不要修改serialVersionUID字段, 避免反序列化失败; 如果完全不兼容升级, 避免反序列化混乱, 那么请修改serialVersionUID值。
  8. 慎用Object的clone方法/BeanUtil的copy方法来拷贝对象, 若想实现深拷贝需要重写clone方法实现属性对象的拷贝。
  9. ArrayList的subList的类型是java.util.RandomAccessSubList, 是ArrayList的一个视图, 不能强转成ArrayList; 对于SubList子列表的所有操作最终会反映到原列表上; 对原列表的修改, 会导致子列表的遍历、增加、删除均会产生ConcurrentModificationException异常; 同时, subList没有实现Serializable接口, 若RPC接口的List类型参数接受了SubList类型的实参,则在RPC调用时会报出序列化异常。比如我们常用的guava中的Lists.partition,切分后的子list实际都是SubList类型,在传给RPC接口之前,需要用new ArrayList()包一层,否则会报序列化异常。
  10. 使用集合转数组的方法, 必须使用集合的toArray(T[] array), 传入的是类型完全一样的数组, 大小就是list.size()。
  11. 方法内部, 抛出异常实例对象为throw; 方法签名中, 抛给调用者的关键字为throws。
  12. 注意checked/unchecked异常, 见下图Java 异常类层次结构, unchecked异常包括Error、RuntimeException, checked异常必须被显式地捕获或者传递。

  13. Hashtable/ConcurrentHashMap的K/V都不允许为null, HashMap的K/V都允许为null, TreeMap的K不允许为null、V允许为null。
  14. FixedThreadPool和SingleThreadPool允许的请求队列长度为Integer.MAX.VALUE, 可能会堆积大量的请求, 从而导致OOM; CachedThreadPool和ScheduledThreadPool允许的创建线程数量为Integer.MAX.VALUE, 可能会创建大量的线程, 从而导致OOM。
  15. 不要在视图模板中(vm)中加入变量声明, 逻辑运算符, 更不要在vm中加入任何复杂的逻辑, 视图的职责是展示, 不要抢模型和控制器的活。

异常日志

  1. 应用中不可直接使用日志系统(Log4j、Logback)中的API, 而应使用门面模式的日志框架(SLF4J、JCL)。
  2. 对trace/debug/info级别的日志输出, 必须使用条件输出形式或者使用占位符的方式。

单元测试

  1. 好的单元测试必须遵守AIR原则: A->Automatic(自动化), I->Independent(独立性), R->Repeatable(可重复)。
  2. 编写单元测试代码遵守BCDE原则, 以保证被测试模块的交付质量: B->Border 边界测试; C->Correct 正确的输入, 预期的结果; D->Design 与设计文档相结合, 来编写单元测试; E->Error 强制错误信息输入, 预期的结果。
  3. 语句覆盖是最弱的一种度量方式; 即使是路径覆盖也不能保证程序完全没问题; 条件覆盖率!=分支覆盖率; 条件覆盖, if里面的每个判断条件, 如if(A && B), 当A/B为true/false、false/true时该语句的条件覆盖率100%; 分支覆盖, if逻辑/没走if逻辑, 当A/B为true/true、false/true时分支覆盖率100%。

安全规约

  1. 水平权限漏洞一般出现在一个用户对象关联多个其他对象(订单、地址等)、并且要实现对关联对象的CRUD的时候。开发容易习惯性的在生成CRUD表单(或AJAX请求)的时候根据认证过的用户身份来找出其有权限的被操作对象id,提供入口,然后让用户提交请求,并根据这个id来操作相关对象。在处理CRUD请求时,往往默认只有有权限的用户才能得到入口,进而才能操作相关对象,因此就不再校验权限了。可悲剧的是大多数对象的ID都被设置为自增整型,所以攻击者只要对相关id加1、减1、直至遍历,就可以操作其他用户所关联的对象了。
  2. Web应用必须正确配置 Robots文件,非 SEO URL必须配置为禁止爬虫访问。SEO-Search Engine Optimization。

MySQL数据库

  1. 如果存储的字符串长度几乎相等, 使用char定长字符串类型
  2. varchar是可变长字符串, 长度不要超过5000, 如果存储长度大于此值, 定义字段类型为text, 独立出来一张表, 用主键来对应。
  3. 字段允许适当冗余, 以提高查询性能, 但必须考虑数据一致。冗余字段应遵循:不是频繁修改的字段、不是varchar超长字段、更不能是text字段。
  4. 表的命名最好是加上“业务名称_表的作用”。
  5. 表必备三字段:id, gmt_create, gmt_modified。
  6. 需要join的字段, 数据类型必须绝对一致; 多表关联查询时, 保证被关联的字段需要有索引; 超过三个表禁止join。
  7. varchar字段上建立索引时, 必须指定索引长度。
  8. 页面搜索严禁左模糊或者全模糊, 如果需要请走搜索引擎来解决。
  9. 索引中有范围查找, 那么索引有序性无法利用, 如: WHERE a > 10 ORDER BY b, WHERE a IN(1, 2, 3) ORDER BY b, 则索引a_b无法排序; 如果在WHERE和ORDER BY的栏位上应用表达式(函数)时,则无法利用索引来实现order by的优化。
  10. WHERE条件列可以不按照索引定义的顺序出现,只要出现的索引列在索引定义顺序的列上能连起来就行,但是order by列不同,出现顺序一定得按照索引定义的顺序,否则无法使用索引进行排序; order by子句和查找型查询的限制是一样的,需要满足索引的最左前缀的要求,否则mysql都需要执行排序操作,而无法使用索引排序。
  11. 建组合索引的时候, 区分度最高的在最左边, 如WHERE a=? and b=?, 当a列值几乎接近于唯一 , 那么只需要单建idx_a索引即可; 建索引时, 请把等号条件的列前置, 如WHERE a>? and b=? 那么即使a的区分度更高, 也必须把b放在索引的最前列。
  12. MySQL涉及的索引从数据结构角度来看涉及到B-Tree、Hash、R-Tree、Full-text, 从物理存储角度, 聚集索引(clustered)、非聚集索引(non-clustered); 聚簇索引(Clustered Indexes),主键就是聚集索引。
  13. 聚簇索引保证关键字的值相近的元组存储的物理位置也相同(所以字符串类型不宜建立聚簇索引,特别是随机字符串,会使得系统进行大量的移动操作),且一个表只能有一个聚簇索引。
  14. MySQL中, InnoDB引擎表是(聚集)索引组织表, 而MylSAM引擎表则是堆组织表。
  15. 二级索引又称辅助索引、非聚集索引(no-clustered index)。然而二级索引的叶子节点不保存记录中的所有列,其叶子节点保存的是<健值,(记录)地址>。好似聚集索引中非叶子节点保存的信息(叶子节点保存的数据本身),不同的是二级索引保存的是记录地址,而聚集索引保存的是下一层节点地址。
  16. 当一列的值全是NULL时, count(col)的返回结果为0, 但sum(col)的返回结果为NULL, 因此使用sum()时需要注意NPE问题。
  17. NULL与任何值的直接比较都为NULL。
  18. iBATIS自带的queryForList(String statementName, int start, int size)不推荐使用, 其实现方式是在数据库取到statementName对应的SQL语句的所有记录, 再通过subList取start, size的集合。

工程结构

  1. GAV: GroupID->com.{公司/BU}.业务线.[子业务线], 最多4级; ArtifactID->产品线名-模块名; Version->主版本号.次版本号.修订号。
  2. 线上应用不要依赖SNAPSHOT版本(安全包除外)。不依赖SNAPSHOT版本是保证应用发布的幂等性, 另外, 也可以加快编译时的打包构建。
  3. dependency:resolve 打印出已解决依赖列表, dependency:tree 打印层级依赖关系, 可以用excludes排除jar包。
  4. 二方库里可以定义枚举类型, 参数可以使用枚举类型, 但是接口返回值不允许使用枚举类型或者包含枚举类型的POJO对象, 会有反序列化的问题。

如果本文档有什么错误, 欢迎大家指出。

原文地址:https://blog.csdn.net/maomaotracy/article/details/80786610


阿里巴巴Java编程规范考试的更多相关文章

  1. Java编程规范参考

    谷歌Java编程规范-原版 谷歌Java编程规范-中文翻译版 阿里巴巴Java编程规范 阿里巴巴Java编程规范-IDEA 插件 阿里巴巴Java编程规范-Eclipse 插件

  2. JAVA编程规范(下)

    JAVA编程规范(下) 2016-03-27 6. 代码的格式化 6.1 对代码进行格式化时,要达到的目的 1.     通过代码分割成功能块和便于理解的代码段,使代码更容易阅读和理解: 2.     ...

  3. JAVA 编程规范(上)

    2016-03-20 J120-CHARLIEPAN JAVA 编程规范(上) 1.      应用范围 本规范应用于采用J2EE规范的项目中,所有项目中的JAVA代码(含JSP,SERVLET,JA ...

  4. Java编程规范(一)

    最近在看一本有关Java编程规范的书,书中精炼阐述了使用java语言时应该遵循的一些原则.接下来的一段时间我将在这里总结我的学习内容,也希望这一系列文章能够对有需要的人有所帮助. 不考虑任何编码规范的 ...

  5. Java编程规范(二)

    二.格式规范 在上一篇的java编程规范(一)中我们讲述了在Java编码中的一般原则,虽然这些原则并不涉及具体的代码规范,但是这些原则却是我们在Java开发过程中所应该遵循的规范与思想.今天我们将学习 ...

  6. FangDD Java编程规范

    我们采用<Oracle/Sun原生的Java编程规范>和<Google Java编程规范> Google Java编程风格指南 January 20, 2014 作者:Haws ...

  7. eclipse安装阿里巴巴java开发规范插件

    阿里巴巴java开发规范插件 作为JAVA开发人员,始终没有一个明确的规范,何为好代码,何为坏代码,造成不同人的代码风格不同,接手别人代码后改造起来相当困难.前不久,阿里巴巴发布了<阿里巴巴Ja ...

  8. myeclipse 阿里巴巴java开发规范

    今天发现阿里巴巴搞了个java开发规范,然后火了: 然后发现我也整了一下: 阿里巴巴java开发规范宣传页: http://mp.weixin.qq.com/s/IbibsXlWHlM59kfXJqR ...

  9. 乐字节Java变量与数据类型之一:Java编程规范,关键字与标识符

    大家好,我是乐字节的小乐,这次要给大家带来的是Java变量与数据类型.本文是第一集:Java编程规范,关键字与标识符. 一.编程规范 任何地方的名字都需要见名知意: 代码适当缩进 书写过程成对编程 对 ...

随机推荐

  1. 洛谷P1248 加工生产调度

    流水作业调度问题 有\(N\)个作业要在两台机器\(M_1\)和\(M_2\)组成的流水线上完成加工.每个作业\(i\)都必须先花时间\(a_i\)在\(M_1\)上加工,然后花时间\(b_i\)在\ ...

  2. ubuntu上安装notepadpp

    Notepad++是一套非常有特色的自由软件的纯文字编辑器(许可证:GPL).有完整的中文化接口及支持多国语言编写的功能(UTF8 技术).它的功能比 Windows 中的 Notepad(记事本)强 ...

  3. windbg双机调试

    win10  测试,当出现下列情况 ,请使用管理员身份运行 设置添加系统环境变量_NT_SYMBOL_PATH 的值为:srv*c:\symbols*http://msdl.microsoft.com ...

  4. MAC使用技巧之苹果电脑抓图截屏方法

    用苹果电脑自带的截图功能的快捷键:command+shift+3 三个键按下则抓取/截取全屏 command+shift+4 然后用鼠标框选则抓取该区域的截图 command+shift+4 然后按空 ...

  5. laravel之文件上传

    laravel框架中的文件上传我们应该如何实现此功能呢? 之前也是没有使用过laravel的文件上传功能,后来在网上找到一些教程,五花八门.让我看起来有点头疼. 有时候找到测试浪费好长时间最后还是出不 ...

  6. java 使用 POI 操作 XWPFDocumen 创建和读取 Office Word 文档基础篇

    注:有不正确的地方还望大神能够指出,抱拳了 老铁! 参考 API:http://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFDoc ...

  7. 2019.11.12htmlhomework1

    ex: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  8. 【Django入坑之路】Form组件

    1:From组件的简单使用 1创建From: #导入模块 from django import forms from django.forms import fields, widgets # 导入自 ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 代码工程地址: https://g ...

  10. HDU_1061:Rightmost Digit

    Problem Description Given a positive integer N, you should output the most right digit of N^N.   Inp ...