写点什么

刚出炉的《Java 开发手册黄山版》,我帮你们圈出了改动点!

作者:捉虫大师
  • 2022 年 2 月 15 日
  • 本文字数:1655 字

    阅读完需:约 5 分钟

hello 大家好,我是小楼~


相信写 Java 的同学应该都听过阿里巴巴的《Java 开发手册》吧?我一开始写 Java 时,也读过这个手册,里面有很多关于代码格式,代码规约的正例、反例,简直就是居家旅行必备的手册。


比如我印象中最深刻的是关于三目运算可能导致空指针的例子,我记得当时为了理解这个例子,还去查看了反编译的 class 文件:


【强制】三目运算符 condition ? 表达式 1:表达式 2 中,高度注意表达式 1 和 2 在类型对齐时,可能

抛出因自动拆箱导致的 NPE 异常。 说明:以下两种场景会触发类型对齐的拆箱操作:1)表达式 1 或 表达式 2 的值只要有一个是原始类型。2)表达式 1 或 表达式 2 的值的类型不一致,会强制拆箱升级成表示范围更大的那个类型。 反例:

Integer a = 1;Integer b = 2;Integer c = null;Boolean flag = false;// a*b 的结果是 int 类型,那么 c 会强制拆箱成 int 类型,抛出 NPE 异常 Integer result = (flag ? a * b : c);


这本开发手册不仅包含了代码级的规约,甚至还包括了设计、工程结构、数据库等等的规约,推荐每一位 Java 工程师都要通读一遍。


这本手册于 2017 年对外发布 1.0.0 版本,直到 2019 年版本名换成了五岳,从华山版到泰山版,再到嵩山,而今年发布了黄山版。估计是想着「五岳归来不看山,黄山归来不看岳」吧。


每次新版本发布,其实是比较关心新版本新增了啥,至于改动,一般不是实质性的变化基本也不用太过关心。但是吧,官方只给了一个粗略的改动日志:



这次的黄山版,新增了 11 条规约,具体是哪 11 条没有说,我花了点时间,帮大家梳理并标注了下。



如果想要带标注的《Java 开发手册-黄山版》,可以在公众号回复关键字「资料」获取。话不多说,下面列举出黄山版新增的 11 条规约:


  • 一、编程规约

  • (二)常量定义

  • 3.【强制】浮点数类型的数值后缀统一为大写的 D 或 F。

  • (十一)其他

  • 6.【强制】枚举 enum(括号内)的属性字段必须是私有且不可变。

  • 二、异常日志

  • (二)异常处理

  • 14.【推荐】为了保护用户隐私,日志文件中的用户敏感信息需要进行脱敏处理。

  • 四、安全规约

  • 9.【强制】对于文件上传功能,需要对于文件大小、类型进行严格检查和控制。

  • 10.【强制】配置文件中的密码需要加密。

  • 五、数据库

  • (一) 建表规约

  • 10.【强制】在数据库中不能使用物理删除操作,要使用逻辑删除。

  • 六、工程结构

  • (二)二方库依赖

  • 6.【强制】二方库定制包的命名方式,在规定的版本号之后加“-英文说明[序号]”,英文说明可以是部门简称、业务名称,序号直接紧跟在英文说明之后,表示此定制包的顺序号。

  • (三)服务器

  • 1.【强制】调用远程操作必须有超时设置。

  • 2.【推荐】客户端设置远程接口方法的具体超时时间(单位 ms),超时设置生效顺序一般为:1)客户端 Special Method;2)客户端接口级别;3)服务端 Special Method;4)服务端接口级别。

  • 7.【推荐】了解每个服务大致的平均耗时,可以通过独立配置线程池,将较慢的服务与主线程池隔离开,免得不同服务的线程同归于尽。

  • 七、设计规约

  • 7.【强制】系统设计时要准确识别出弱依赖,并针对性地设计降级和应急预案,保证核心系统正常可用。


其中「枚举 enum(括号内)的属性字段必须是私有且不可变」有点意思,初次读到,不知是什么意思,于是我查到了如下的反例:


public enum SwitchStatus {    // 枚举的属性字段反例    DISABLED(0, "禁用"),    ENABLED(1, "启用");     public int value;    private String description;     private SwitchStatus(int value, String description) {        this.value = value;        this.description = description;    }     public String getDescription() {        return description;    }     public void setDescription(String description) {        this.description = description;    }}
复制代码


这里的valuedescription都可以被修改,如果被改了,后果不堪设想。虽然我没想过枚举可以这么玩,但这确实是个风险点,有则加冕无则改之。




搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。公众号对话框回复「资料」领取标注版《Java 开发手册-黄山版》

发布于: 刚刚阅读数: 2
用户头像

捉虫大师

关注

还未添加个人签名 2018.09.19 加入

欢迎关注我的公众号“捉虫大师”

评论

发布
暂无评论
刚出炉的《Java开发手册黄山版》,我帮你们圈出了改动点!