阿里巴巴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. mysql各个引擎区别

    1.如果你有一个 MyISAM 数据表包含着 FULLTEXT 或 SPATIAL 索引,你将不能把它转换为使用 另一种引擎,因为只有 MyISAM 支持这两种索引. 2. 如果你有一个数据表包含着一 ...

  2. pytest fixture 利用 params参数实现用例集合

    @pytest.fixture有一个params参数,接受一个列表,列表中每个数据都可以作为用例的输入.也就说有多少数据,就会形成多少用例.如下面例子,就形成3条用例 test_parametrizi ...

  3. Directx11教程(61) tessellation学习(3)

    原文:Directx11教程(61) tessellation学习(3)       现在我们看看在不同tess factor的情况下,三角形是如何细分的?(这儿三条边和内部tess factor值是 ...

  4. C++之以分隔符的形式获取字符串

    void CConvert::Split(const std::string& src, const std::string& separator, std::vector<st ...

  5. “龙井”开箱评测 |Alibaba Dragonwell 新手上路指南

    作者|阿里云智能事业群 高级技术专家 陆传胜 阿里巴巴有着最丰富的 Java 应用场景,覆盖电商,金融,物流等众多领域,是世界上最大的 Java 用户之一. 2019 年 3 月 21 日,阿里巴巴在 ...

  6. PLAY2.6-SCALA(七) Streaming HTTP response

    1.从HTTP1.1开始,服务端为了在single connection下对HTTP请求及响应提供服务,需要在response中提供响应的Content-Length. 默认情况下,不需要显示的指明C ...

  7. linux CentOs 7.4 64位 系统下 nuxt部署 、nginx 安装、node环境及软连接,pm2软连接

    一.nginx安装 1.安装依赖包 //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2 ...

  8. 【JZOJ4889】【NOIP2016提高A组集训第14场11.12】最长公共回文子序列

    题目描述 YJC最近在学习字符串的有关知识.今天,他遇到了这么一个概念:最长公共回文子序列.一个序列S,如果S是回文的且分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...

  9. POI解决内存溢出问题

    在POI3.8中SXSSF仅仅支持excel2007格式是对XSSF的一种流的扩展.目的在生成excel时候,需要生成大量的数据的时候,通过刷新的方式将excel内存信息刷新到硬盘的方式,提供写入数据 ...

  10. 《spring boot》8.2章学习时无法正常启动,报“ORA-00942: 表或视图不存在 ”

    在学习<spring boot>一书的过程中,由于原书作者难免有一些遗漏的的地方,或者系统.软件版本不一致.框架更新等各种因素,完全安装书中源码页不能实现项目的正常启动 在8.2章节,演示 ...