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

捉虫大师
• 阅读 1497

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年版本名换成了五岳,从华山版到泰山版,再到嵩山,而今年发布了黄山版。估计是想着「五岳归来不看山,黄山归来不看岳」吧。

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

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

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

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

如果想要带标注的《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开发手册-黄山版》

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
Java日期时间API系列30
  实际使用中,经常需要使用不同精确度的Date,比如保留到天2020042300:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyyMMdd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Format方法、 使用Of方法和使用With方法,性能对比,使用
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这