• 阿里巴巴Java开发手册 终极版 阅读摘要


    云栖大会的这段时间发布了开发手册终极版,同时明天还会发布IDE代码校验插件,等明天插件及源码出来后再仔细研究下。看完整个手册之后,感觉很多都是在做项目当中会遇到的内容,有些注意到了,有些没有注意到,特地整理出来记录下来。

    1、
    使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方 法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
    说明:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。

    2、
    使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无 内容的检查,否则会有抛 IndexOutOfBoundsException 的风险 ,因为如果为空的话那么不会被切割到。

    3、
    不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。

    4、
    集合初始化时,指定集合初始值大小。HashMap 使用 HashMap(int initialCapacity) 初始化,因为如果不设置的话就可能会进行被迫扩大操作,resize 需要重建 hash 表,严重影响性能。

    5、
    使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。如果是 JDK8,使用 Map.foreach 方法。

    6、
    并发修改同一记录时,避免更新丢失,需要加锁。要么在应用层加锁,要么在缓存加锁,要么在数据库层使用乐观锁,使用version作为更新依据。
    说明:如果每次访问冲突概率小于20%,推荐使用乐观锁,否则使用悲观锁。乐观锁的重试次数不得小于3次。
    (乐观锁,大多是基于数据版本 ( Version )记录机制实现,适用于冲突发生比较少的情况。 悲观锁,只要有人操作就加锁,防止并发多人一同处理)

    7、
    在if/else/for/while/do语句中必须使用大括号。即使只有一行代码,避免采用单行的编码方式:if (condition) statements;

    8、
    类、类属性、类方法的注释必须使用Javadoc规范,使用/**内容*/格式,不得使用// xxx方式。

    10、
    方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释,注意与代码对齐。

    11、
    善用 特殊注释标记:TODO、FIXME

    12、
    后台输送给页面的变量必须加$!{var}——中间的感叹号。
    说明:如果var=null或者不存在,那么${var}会直接显示在页面上。

    13、
    获取当前毫秒数System.currentTimeMillis(); 而不是new Date().getTime(); 说明:如果想获取更加精确的纳秒级时间值,使用System.nanoTime()的方式。在JDK8中,针对统计时间等场景,推荐使用Instant类。

    14、
    正例:对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三个斜杠(///)来说明注释掉代码的理由。

    15、
    对大段代码进行try-catch,这是不负责任的表现。catch时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的catch尽可能进行区分异常类型,再做对应的异常处理。

    16、
    编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量。
    B:Border,边界值测试,包括循环、特殊取时间点数据顺序等。 ,
    C:Correct,正确的输入,并得到预期结果。
    D:Design,与设计文档相结合,来编写单元测试。
    E:Error,强制错误信息输入(如:非法数据、异常流程业务允许等),并得到预期的结果。

    17、
    表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint( 1表示是,0表示否)。
    说明:任何字段如果为非负数,必须是unsigned。
    正例: 表达逻辑删除的字段名 is_deleted,1表示删除, 0表示未删除。

    18、
    表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
    说明:Mysql在window是不区分大小写的,但是在Linux系统中是区分大小写的。

    19、
    表名不使用复数名词。 说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于DO类名也是单数形式,符合表达习惯。

    20、
    不要使用count(列名)或count(常量)来替代count(),count()是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。
    说明:count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行。

    21、
    不得使用外键与级联,一切外键概念必须在应用层解决。
    说明:外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

    22、
    禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。

    23、
    TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但TRUNCATE无事务且不触发trigger,有可能造成事故,故不建议在开发代码中使用此语句。
    说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。

    24、
     DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
     DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
     BO(Business Object):业务对象。由Service层输出的封装业务逻辑的对象。
     AO(Application Object):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
     VO(View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。
     Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输。

    25、
    服务器内部重定向使用forward;外部重定向地址使用URL拼装工具类来生成,否则会带来URL维护不一致的问题和潜在的安全风险。

        顺便记录下终极版下载地址:阿里云社区
        下载地址:https://yq.aliyun.com/articles/69327
  • 既然不能成为屠龙的勇士,那么就好好成为一名优秀的管家,为公主建设一个温馨美好的家。
    Since it can not become a dragon warrior, then it is a good housekeeper, for the princess to build a warm and beautiful home.

  • 相关阅读:
    Android 面试题(答案最全)
    Android Studio导入github下载的工程
    Android清除本地数据缓存代码
    内存缓存LruCache实现原理
    OD调试器调试Delphi程序按钮事件断点方法
    OllyDBG找到按钮的处理函数
    delphi中Record 和Packed Record的区别
    这些年,我们自己换的滤芯
    大众车机天宝187A Hack笔记
    Delphi中DLL的创建和使用
  • 原文地址:https://www.cnblogs.com/ITflying/p/7661764.html
  • Copyright © 2020-2023  润新知