1. boolean&Boolean类型的字段生成getter&setter方法差异示例

/**
 * boolean类型、idea快捷生成
 */
public class JavaBean {

    private boolean delete;

    public boolean isDelete() {
        return delete;
    }

    public void setDelete(boolean delete) {
        this.delete = delete;
    }
}

/**
 * Boolean类型、idea快捷生成
 */
public class JavaBean {

    private Boolean delete;

    public Boolean getDelete() {
        return delete;
    }

    public void setDelete(Boolean delete) {
        this.delete = delete;
    }
}

这里可以看到:
boolean类型生成的getter&setter方法与Boolean类型生成的getter方法有所不同

  • boolean类型的getter方法按照isXxx格式命名
  • Boolean类型的getter方法与其他基本数据类型的包装类型一致按getXxx格式命名

2. isXxx&xxx格式的字段名比较boolean&Boolean,以及在使用lombok注解@Data时getter&setter方法有什么变化

/**
 * isXxx、boolean类型
 */
public class JavaBean {

    private boolean isDelete;

    public boolean isDelete() {
        return isDelete;
    }

    public void setDelete(boolean delete) {
        isDelete = delete;
    }
}

/**
 * isXxx、Boolean类型
 */
public class JavaBean {

    private Boolean isDelete;

    public Boolean getDelete() {
        return isDelete;
    }

    public void setDelete(Boolean delete) {
        isDelete = delete;
    }
}


/**
 * isXxx、boolean类型,lombok组件@Data反编译结果
 */
 public class JavaBean {
    private boolean isDelete;

    public boolean isDelete() {
        return this.isDelete;
    }

    public void setDelete(boolean isDelete) {
        this.isDelete = isDelete;
    }
 }


/**
 * isXxx、Boolean类型,lombok组件@Data反编译结果
 */
 public class JavaBean {

    private Boolean isDelete;

    public Boolean getIsDelete() {
        return this.isDelete;
    }

    public void setIsDelete(Boolean isDelete) {
        this.isDelete = isDelete;
    }
}
  • isXxx、boolean类型的getter&setter方法:isDelete和delete生成了一模一样的getter&setter方法
  • isXxx、Boolean类型的getter&setter方法:isDelete和delete生成了一模一样的getter&setter方法
  • isXxx、boolean类型,使用lombok组件@Data:反编译结果显示lombok自动生成的getter&setter方法和手动生成的一致
  • ixXxx、Boolean类型的getter&setter方法: 反编译结果显示lombok自动生成的getter&setter方法名和手动生成的都不一样

3.常见序列化与反序列化工具类对于getter&setter方法名的影响

我们从日常开发中选择比较常用的三种JSON转换组件 fastjson、jackson、gson,以这三个为例测试一下xxx和isXxx格式在各种场景下序列化和反序列化的情况
案例如下:

/**
 * isXxx、boolean类型
 */
public class JavaBean {
    private boolean isDelete;

    public boolean isDelete() {
        return isDelete;
    }

    public void setDelete(boolean delete) {
        isDelete = delete;
    }
}


public void example01() throws JsonProcessingException {
        JavaBean javaBean = new JavaBean();
        javaBean.setDelete(true);

        String jsonStr = JSON.toJSONString(javaBean);
        log.info("javaBean:{}", jsonStr);
        JavaBean transferBean = JSONObject.parseObject(jsonStr, JavaBean.class);
        log.info("transferBean:{}", JSON.toJSONString(transferBean));

        //输出1: javaBean:{"delete":true}
        //输出2 : transferBean:{"delete":true}

        ObjectMapper objectMapper = new ObjectMapper();
        jsonStr = objectMapper.writeValueAsString(javaBean);

        log.info("javaBean:{}", jsonStr);
        transferBean = objectMapper.readValue(jsonStr, JavaBean.class);
        log.info("transferBean:{}", objectMapper.writeValueAsString(transferBean));

        //输出1: javaBean:{"delete":true}
        //输出2 : transferBean:{"delete":true}

        Gson gson = new Gson();
        javaBean = gson.fromJson(jsonStr, JavaBean.class);
        log.info("javaBean:{}", gson.toJson(javaBean));
        transferBean = gson.fromJson(gson.toJson(javaBean), JavaBean.class);
        log.info("transferBean:{}", gson.toJson(transferBean));

        //输出1: javaBean:{"delete":false}
        //输出2 : transferBean:{"delete":false}
}

/**
 * isXxx、Boolean类型
 */
public class JavaBean {
    private Boolean isDelete;

    public boolean isDelete() {
        return isDelete;
    }

    public void setDelete(boolean delete) {
        isDelete = delete;
    }
}


public void example02() throws JsonProcessingException {
        JavaBean javaBean = new JavaBean();
        javaBean.setDelete(true);

        String jsonStr = JSON.toJSONString(javaBean);
        log.info("javaBean:{}", jsonStr);
        JavaBean transferBean = JSONObject.parseObject(jsonStr, JavaBean.class);
        log.info("transferBean:{}", JSON.toJSONString(transferBean));

        //输出1: javaBean:{"delete":true}
        //输出2 : transferBean:{"delete":true}

        ObjectMapper objectMapper = new ObjectMapper();
        jsonStr = objectMapper.writeValueAsString(javaBean);

        log.info("javaBean:{}", jsonStr);
        transferBean = objectMapper.readValue(jsonStr, JavaBean.class);
        log.info("transferBean:{}", objectMapper.writeValueAsString(transferBean));

        //输出1: javaBean:{"delete":true}
        //输出2 : transferBean:{"delete":true}

        Gson gson = new Gson();
        javaBean = gson.fromJson(jsonStr, JavaBean.class);
        log.info("javaBean:{}", gson.toJson(javaBean));
        transferBean = gson.fromJson(gson.toJson(javaBean), JavaBean.class);
        log.info("transferBean:{}", gson.toJson(transferBean));

        //输出1: javaBean:{}
        //输出2 : transferBean:{}
}


/**
 * isXxx、Boolean类型,lombok组件@Data反编译结果
 */
 public class JavaBean {

    private Boolean isDelete;

    public Boolean getIsDelete() {
        return this.isDelete;
    }

    public void setIsDelete(Boolean isDelete) {
        this.isDelete = isDelete;
    }
}

 public void fieldNamingFormatForIs() throws JsonProcessingException {
    JavaBean javaBean = new JavaBean();
    javaBean.setIsDelete(true);

    String jsonStr = JSON.toJSONString(javaBean);
    log.info("javaBean:{}", jsonStr);
    JavaBean transferBean = JSONObject.parseObject(jsonStr, JavaBean.class);
    log.info("transferBean:{}", JSON.toJSONString(transferBean));

    //输出1: javaBean:{"isDelete":true}
    //输出2 : transferBean:{"isDelete":true}

    ObjectMapper objectMapper = new ObjectMapper();
    jsonStr = objectMapper.writeValueAsString(javaBean);

    log.info("javaBean:{}", jsonStr);
    transferBean = objectMapper.readValue(jsonStr, JavaBean.class);
    log.info("transferBean:{}", objectMapper.writeValueAsString(transferBean));

    //输出1: javaBean:{"isDelete":true}
    //输出2 : transferBean:{"isDelete":true}

    Gson gson = new Gson();
    javaBean = gson.fromJson(jsonStr, JavaBean.class);
    log.info("javaBean:{}", gson.toJson(javaBean));
    transferBean = gson.fromJson(gson.toJson(javaBean), JavaBean.class);
    log.info("transferBean:{}", gson.toJson(transferBean));

    //输出1: javaBean:{"isDelete":true}
    //输出2 : transferBean:{"isDelete":true}
 }

结论:综上可观察到,isXxx格式在序列化和反序列化时根据不同情况和不同工具类,差异不小,可能在日常开发中稍不注意,就会导致有效字段的值填充不到位。

4.boolean属性名避免使用 “is” 开头的名称

1.阿里java开发规范提到:
在这里插入图片描述
2.javaBeans规范中对这些均有相应的规定,基本数据类型的属性,其getter和setter方法是getXXX()和setXXX,但是对于基本数据中布尔类型的数据,又有一套规定,其getter和setter方法是isXXX()和setXXX,但是包装类型都是以get开头。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐