阿里手册 为啥
定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
业务逻辑清晰:在定义POJO类时,最好让业务逻辑和默认值初始化分离。不设置属性默认值可以明确表示属性在创建对象时并没有具体的值,需要在业务逻辑中进行处理或者由外部传入。
避免数据混淆:在POJO类中设置默认值可能会导致数据混淆和逻辑错误。如果属性具有默认值,但实际业务中没有明确给出,可能会导致错误的计算或错误的判断,从而引发潜在的问题。
提高代码可读性和可维护性:不设置默认值可以使代码更加清晰和易读。通过显式地要求在使用POJO类时明确设置属性的值,可以更清楚地了解代码的意图,并提高代码的可维护性。此外,不设置默认值可以减少冗余代码,并降低代码复杂度。
反例:
POJO 类的 gmtCreate 默认值为 new Date();
但是这个属性在数据提取时并没有置入具体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。
根据参考资料中的内容以及我的专业知识,我将解答问题并给出解决方案。问题是关于阿里手册中建议不在定义POJO类时设定属性的默认值的理由和优势。
阿里手册中不建议为属性设定任何默认值的理由如下:
服务层与表现层的语义不一致:在服务层定义的属性默认值可能与在表现层的语义不一致。例如,服务层将性别定义为1代表男性,2代表女性,0代表未定义;而在表现层,可能需要用文本来表示性别,如“男”、“女”等。如果在定义POJO类时设定默认值,会导致在不同层之间的转换困难,增加代码复杂度和可维护性。
服务层逻辑和表现层展示解耦:服务层应该只负责业务逻辑,与具体的表现形式无关。在服务层返回的DTO类中,不应该包含与表现形式相关的属性,以避免耦合。表现层应该根据业务需要从DTO类中获取需要展示的数据,并根据表现层的要求进行处理和显示。
需要支持不同的客户端风格:如果后端服务需要面向多个客户端,而这些客户端对于表现层的要求有所不同,定义默认值可能无法满足不同客户端的需求。使用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方法来获取对应的文本,而不需要在定义属性时设定默认值。
请注意,由于示例代码是根据问题描述进行的假设和推导,因此实际应用中的具体实现可能会有所不同。