接上篇:https://developer.aliyun.com/article/1228116?spm=a2c6h.13148508.setting.32.21084f0eNCKPti
四、 定义模型类
下面,以定义User(用户)模型类为例,从JavaBean模式、重载构造方法、Builder模式3种方式,来说明模型类的定义方法以及优缺点。
假设:User(用户)模型类共有4个属性——id(标识)、name(名称)、age(年龄)、desc(描述),其中必填属性为——id(标识)、name(名称),可填属性为——age(年龄)、desc(描述)。
1. JavaBean模式
JavaBean是一个遵循特定写法的Java类,它通常具有如下特点:
• 必须具有一个无参的构造方法;
• 所有属性字段必须是私有的;
• 所有属性字段必须通过遵循一种命名规范的Getter/Setter方法开放出来。
通过JavaBean模式定义的User(用户)模型类如下:
注意:
也可以通过Lombok的@Getter/@Setter注解生成对应个Getter/Setter方法。
1) 使用代码
2) 主要优点
• 代码非常简单,只有私有属性字段及其公有Getter/Setter方法;
• 赋值对象代码可读性较强,明确地知道哪个属性字段对应哪个值;
• 非常简单实用,被广泛地用于HSF、Dubbo、MyBatis等中间件。
3) 主要缺点
• 由于可以通过Setter方法设置属性字段,所以不能定义为不可变类;
• 由于每个字段分别设置,所以不能保证字段必填,必须设置完毕后进行统一验证。
2. 重载构造方法
通过“重载构造方法”定义User(用户)模型类如下:
1) 使用代码
2) 主要优点
• 初始化对象代码简洁,只有简单的一行代码;
• 可以定义为不可变类,初始化后属性字段值不可变更;
• 可以在构造方法内进行不可空验证。
3) 主要缺点
• 重载构造方法数量过多,无法覆盖必填字段和非必填字段的所有组合;
• 初始化对象代码可读性差,无法看出哪个属性字段对应哪个值;
• 如果删除某个字段,初始化对象代码可能不会报错,导致出现赋值错误问题。
3. Builder模式
/** 用户类 */ public final class User { private Long id; private String name; private Integer age; private String desc;
private User(Builder builder) { this.id = builder.id; this.name = builder.name; this.age = builder.age; this.desc = builder.desc; } public static Builder newBuilder(Long id, String name) { return new Builder(id, name); }
public Long getId() {return id;} public String getName() {return name;} public Integer getAge() {return age;} public String getDesc() {return desc;}
public static class Builder { private Long id; private String name; private Integer age; private String desc;
private Builder(Long id, String name) { Assert.notNull(id, "标识不能为空"); Assert.notNull(name, "名称不能为空"); this.id = id; this.name = name; } public Builder age(Integer age) { this.age = age; return this; } public Builder desc(String desc) { this.desc = desc; return this; } public User build() { return new User(this); } } }
``` |
注意:
可以采用Lombok的@Builder注解简化代码。
1) 使用代码
2) 主要优点
• 明确了必填参数和可选参数,在构造方法中进行验证;
• 可以定义为不可变类,初始化后属性字段值不可变更;
• 赋值代码可读性较好,明确知道哪个属性字段对应哪个值;
• 支持链式方法调用,相比于调用Setter方法,代码更简洁。
3) 主要缺点
• 代码量较大,多定义了一个Builder类,多定义了一套属性字段,多实现了一套赋值方法;
• 运行效率低,需要先创建Builder实例,再赋值属性字段,再创建目标实例,最后拷贝属性字段。
接下篇:https://developer.aliyun.com/article/1228114?groupCode=java