Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

《Java开发手册(黄山版)》编程规约 -- 命名风格 中第 9 点的错误 #878

Closed
samho2008 opened this issue Feb 21, 2022 · 2 comments

Comments

@samho2008
Copy link

规约原文

9.【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。
说明:本文 MySQL 规约中的建表约定第 1 条,表达是与否的变量采用 is_xxx 的命名方式,所以需要在
设置从 is_xxx 到 xxx 的映射关系。
反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析时,“误以为”对
应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

问题描述

反例中的例子描述是错误的。
原因:Boolean是包装类型,而包装类型属于引用类型。因此 基本数据类型 Boolean 的描述是错误的。
解释:那么,这句话就有两种情况了,到底是 基本数据类型 boolean isDeleted,还是 引用数据类型 Boolean isDeleted 呢?
这里我做了个测试,定义一个以 is 前缀开头的字段,使用开发工具生成 getset 方法

情况一:基本数据类型 boolean

    class Item {
        private boolean isDeleted;

        public boolean isDeleted() {
            return isDeleted;
        }

        public void setDeleted(boolean deleted) {
            isDeleted = deleted;
        }
    }

情况二:引用数据类型 Boolean

    class Item {
        private Boolean isDeleted;

        public Boolean getDeleted() {
            return isDeleted;
        }

        public void setDeleted(Boolean deleted) {
            isDeleted = deleted;
        }
    }

情况三:基本数据类型 boolean

    class Item {
        private boolean deleted;

        public boolean isDeleted() {
            return deleted;
        }

        public void setDeleted(boolean deleted) {
            this.deleted = deleted;
        }
    }

结论:
对于基本类型的 boolean 而言,isDeleted 生成出来的 get 方法名还是 isDeleted,即 get 方法名和字段名相同
对于引用类型的 Boolean 而言,isDeleted 生成出来的 get 方法名是 getDeleted

修改建议

反例:定义为基本数据类型 boolean isDeleted 的字段,它的 getter 方法也是 isDeleted(),部分框架在反向解析时,“误以为”对
应的字段名称是 deleted,导致找不到此字段,进而抛出异常或得到意料之外的结果。

修改点如下:

  1. 基本数据类型 Boolean -> 基本数据类型 boolean
    修改原因:至于为什么可以参考上面,也是最需要修改的地方)
  2. 属性 -> 字段
    修改原因:属性包括类成员字段 + getter方法 + setter方法,这里应该是定义字段更合适
  3. 它的方法 -> 它的 getter 方法
    修改原因:字段的方法至少包括 getter 方法、setter 方法,这里最好具体说明是 getter 方法才会有此问题,否则会有歧义
  4. 框架 -> 部分框架
    修改原因:并不是所有的框架都是使用方法名来获取属性值的,有的框架是通过字段名(如 gson),所以不会有问题,具体测试可以参考本人之前写的一篇文章带你从头到尾解释为什么阿里巴巴规范中强制布尔类型不要加is?三种java的json解析框架jackson、gson、fasterjson的用法和解析
  5. 属性名称 -> 字段名称
    修改原因:同第 2 点
  6. 导致属性获取不到 -> 导致找不到此字段
    修改原因:如果框架是通过 getter 方法获取属性的值,那肯定可以获取到的。但是有的框架是通过 getter 方法中的名字来反向解析获取字段的值,这个时候才会找不到字段。
  7. 进而抛出异常 -> 进而抛出异常或得到意料之外的结果
    修改原因:不一定抛出异常的,取决于框架。
@samho2008
Copy link
Author

pr #879

@gujin520
Copy link
Contributor

已经修改,感谢

@dyrone dyrone closed this as completed May 11, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants