阿里手册 为啥定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值

阿里手册 为啥
定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。

  1. 业务逻辑清晰:在定义POJO类时,最好让业务逻辑和默认值初始化分离。不设置属性默认值可以明确表示属性在创建对象时并没有具体的值,需要在业务逻辑中进行处理或者由外部传入。

  2. 避免数据混淆:在POJO类中设置默认值可能会导致数据混淆和逻辑错误。如果属性具有默认值,但实际业务中没有明确给出,可能会导致错误的计算或错误的判断,从而引发潜在的问题。

  3. 提高代码可读性和可维护性:不设置默认值可以使代码更加清晰和易读。通过显式地要求在使用POJO类时明确设置属性的值,可以更清楚地了解代码的意图,并提高代码的可维护性。此外,不设置默认值可以减少冗余代码,并降低代码复杂度。

  • 这篇文章:关于POJO,DO/DTO/BO/VO说明 也许能够解决你的问题,你可以看下
  • 除此之外, 这篇博客: 《阿里巴巴 Java 开发手册》(一)中的 9、【强制】定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 反例:

    POJO 类的 gmtCreate 默认值为 new Date(); 但是这个属性在数据提取时并没有置入具体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料中的内容以及我的专业知识,我将解答问题并给出解决方案。问题是关于阿里手册中建议不在定义POJO类时设定属性的默认值的理由和优势。

    阿里手册中不建议为属性设定任何默认值的理由如下:

    1. 服务层与表现层的语义不一致:在服务层定义的属性默认值可能与在表现层的语义不一致。例如,服务层将性别定义为1代表男性,2代表女性,0代表未定义;而在表现层,可能需要用文本来表示性别,如“男”、“女”等。如果在定义POJO类时设定默认值,会导致在不同层之间的转换困难,增加代码复杂度和可维护性。

    2. 服务层逻辑和表现层展示解耦:服务层应该只负责业务逻辑,与具体的表现形式无关。在服务层返回的DTO类中,不应该包含与表现形式相关的属性,以避免耦合。表现层应该根据业务需要从DTO类中获取需要展示的数据,并根据表现层的要求进行处理和显示。

    3. 需要支持不同的客户端风格:如果后端服务需要面向多个客户端,而这些客户端对于表现层的要求有所不同,定义默认值可能无法满足不同客户端的需求。使用VO来解决这个问题,可以在表现层定义不同的显示文本或其他属性表示,以适应不同的客户端风格。

    根据以上理由,我认为不在定义POJO类时设定属性的默认值可以有效地将服务层和表现层解耦,提升代码的可维护性和可扩展性。

    以下是一个示例代码来展示如何按照阿里手册的建议来定义POJO类的:

    public class UserDTO {
        private int id;
        private String name;
        private int gender;
        // other properties
    
        // getters and setters
    
        public String getDisplayGender() {
            // 根据gender属性的值返回不同的展示文本或其他表示
            if (gender == 1) {
                return "男";
            } else if (gender == 2) {
                return "女";
            } else {
                return "未定义";
            }
        }
    }
    

    在上述示例代码中,UserDTO类中的gender属性没有设定默认值,而是提供了一个get方法来获取展示性别的文本表示。这样,在需要展示性别的时候,可以调用get方法来获取对应的文本,而不需要在定义属性时设定默认值。

    请注意,由于示例代码是根据问题描述进行的假设和推导,因此实际应用中的具体实现可能会有所不同。