疯了!同事又问我为什么不能用 isXXX

简介: 最近在做Code Review,写下了这篇文章:代码写成这样,老夫无可奈何!,说多了都是泪啊。。

最近在做Code Review,写下了这篇文章:代码写成这样,老夫无可奈何!,说多了都是泪啊。。


最近又有人同事跑过来质疑我: 为什么变量名取名不能用 isXXX 这种方式,这样有什么问题?!


醉了,讲了好多次都记不住,我让他自己去看阿里巴巴的《Java开发手册》,或者自行百度,说实话,有点工作经验人都知道,这都是基础的东西。


本没什么好写的,鉴于有好多小白程序员,今天栈长就把为什么不能用 isXXX 拿出来分享一篇文章吧,希望对你有用。


首先我们来看阿里巴巴的《Java开发手册》关于 isXXX 是怎么定义的吧:


【强制】POJO 类中布尔类型变量都不要加 is 前缀,否则部分框架解析会引起序列化错误。

反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),RPC 框架在反向解析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。


上面的规范很容易理解吧,就是如果使用 isXXX 这种命名形式会引起潜在的异常呗!


获取阿里巴巴的《Java开发手册》完整版,请关注微信公众号:Java技术栈,在后台回复:手册。


我们再来看一段 IDE 生成的 getter/setter 代码:

public class Staff {
    private String name;
    private boolean graduated;
    private boolean isMarried;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean isGraduated() {
        return graduated;
    }
    public void setGraduated(boolean graduated) {
        this.graduated = graduated;
    }
    public boolean isMarried() {
        return isMarried;
    }
    public void setMarried(boolean married) {
        isMarried = married;
    }
}

变量 isMarried 生成的 getter/setter 方法是:isMarried/setMarried,有些框架就会去找对应的 married 变量,然后就找不到了…


再看变量 graduated,因为都是 boolean 变量,所有生成的逻辑和 isMarried 一样,根据上述规范,它不会产生找不着值的情况,这也是为什么不建议使用 isXXX 的命名形式。


这个问题我之前有个同事在使用某个 Web 框架的时候就遇到过,在页面上使用该框架的标签显示对象的值,如:xx.xxx,然后就死活取不到值,还报异常,最后定位就是这个问题。


再看到有同事这样写,或者问你为什么,把这篇文章丢给他吧。。


相关文章
|
Java 开发工具 Maven
svn篇2:idea中使用svn
svn篇2:idea中使用svn
6990 0
|
2月前
|
存储 网络协议 数据挖掘
阿里云通用算力型实例u1、u2i、u2a有何不同?各实例性能、适用场景对比与选择参考
通用算力型实例是阿里云推出主打性价比的云服务器实例规格,目前u1实例推出时间叫久,也有特惠,例如u1实例2核4G5M带宽199元一年,且续费价格不变。而通用算力型实例u2i已正式商业化,通用算力型实例u2a目前还处于开放公测阶段,有的用户不清楚他们之间的区别,本文为大家介绍这三个通用算力型实例的性能、适用场景对比,以供选择参考。
|
7月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
635 6
|
2月前
|
人工智能 JSON API
快速上手Cursor,让AI替你敲键盘
Cursor Editor基于VS Code内核,深度集成GPT-4等大模型,支持对话式编程。通过Ctrl+K和Ctrl+L快捷键,可快速生成、修改、解释代码,智能调试与重构。适合开发者提升效率,专注核心设计。
|
存储 关系型数据库 MySQL
阿里巴巴MYSQL 开发规范
阿里巴巴MYSQL 开发规范
1710 0
|
SQL JSON 数据库
influxdb 端点使用http进行sql查询,写数据
influxdb 端点使用http进行sql查询,写数据
832 0
|
Nacos
Nacos 服务状态监听四种写发
Nacos 服务状态监听四种写发
403 0
|
SQL 数据处理 数据库
|
Kubernetes 算法 NoSQL
动态扩缩容下的全局流水号设计
该文介绍了在动态扩缩容场景下如何使用雪花算法生成全局流水号。雪花算法生成的ID由时间戳、工作机器ID和序列号组成。在K8s环境中,通过Redis存储当前workerId的最大值,每次生成时加1并取模,确保workerId在0-1023范围内。文中提供了实现雪花算法的`SnowflakeIdWorker`类示例,并展示了两种动态获取workerId的方法:一是利用Redis incr操作;二是通过Nacos服务发现获取IP和端口信息计算。此外,还提到了其他获取workId和dataCenterId的策略,如使用本地IP和主机名。
416 1
|
Java Maven
Cannot access aliyunmaven ( xxx ) in offline mode and the artifact
Cannot access aliyunmaven ( xxx ) in offline mode and the artifact
1315 0