目录
一、应用场景描述
一个项目中,可能有多层数据。
在每层数据中,都会跟下层数据进行数据转换。
那么这时候,如何进行数据转换能简单高效,维护(增删字段时的修改)还轻松呢?
最近,我找到了【多态参数】,我觉得比我的笨方法好用,降低了我的维护成本。
二、理论说明
2.1 多态参数的定义
方法的形参类型定义为父类类型,
当传入的实参类型为子类类型时,
每传入一个子类对象,都相当于形成了一次多态(父类引用指向子类对象)。
2.1 什么是父类引用指向子类对象?
在Java中,父类引用指向子类对象是一种多态性的应用情况。
这意味着可以将一个子类对象赋值给一个父类类型的引用变量。
这种情况下,该引用变量可以调用父类中定义的方法和属性,
也可以调用子类中重写的方法和属性。
这种特性称为向上转型。
例如,假设有一个Animal类和一个Dog类,Dog类是Animal类的子类。
可以创建一个Dog对象,并将其赋值给一个Animal类型的引用变量。
这样,该引用变量可以调用Animal类中定义的方法和属性,
也可以调用Dog类中重写的方法和属性。
三、方案呈现(推荐使用)
3.1 下层数据
/** * 用户 * */ public class UserEntity { private Long userId; private String name; private String phone; public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
3.2 本层数据
(1)父类UserModel
public class UserModel { private Long userId; private String name; private String phone; public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
(2)子类UserModelIncludeStats
public class UserModelIncludeStats extends UserModel {
private Long userNum; // 用户总数
public Long getUserNum() {
return userNum;
}
public void setUserNum(Long userNum) {
this.userNum = userNum;
}
}
3.3 数据转换
public class DataConversionMain { // 子类转换 public UserModelIncludeStats toUserModelIncludeStats(UserEntity entity) { if (entity == null) { return null; } UserModelIncludeStats model = new UserModelIncludeStats(); // 跟 UserModel 相同字段的处理 toUserModel(model, entity); // UserModelIncludeStats 独有字段 model.setUserNum(7L); return model; } // 父类转换 public UserModel toUserModel(UserEntity entity) { if (entity == null) { return null; } UserModel model = new UserModel(); toUserModel(model, entity); return model; } // model 是 多态参数 public void toUserModel(UserModel model, UserEntity entity) { if (entity == null) { return; } // 维护位置1 model.setUserId(entity.getUserId()); model.setName(entity.getName()); model.setPhone(entity.getPhone()); } }
3.4 说明
如果 UserModel 或 UserEntity 增删字段时,此时只维护1个地方,比笨方案少了一个维护位置。
四、笨方案展示(不推荐)
4.1 下层数据
public class UserEntity { private Long userId; private String name; private String phone; public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
4.2 本层数据
(1)父类UserModel
public class UserModel { private Long userId; private String name; private String phone; // 维护位置1 public void setUserModel(UserModel model) { this.setUserId(model.getUserId()); this.setName(model.getName()); this.setPhone(model.getPhone()); } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
(2)子类UserModelIncludeStats
public class UserModelIncludeStats extends UserModel { private Long userNum; // 用户总数 public Long getUserNum() { return userNum; } public void setUserNum(Long userNum) { this.userNum = userNum; } }
4.3 数据转换
public class DataConversionMain { // 子类转换 public UserModelIncludeStats toUserModelIncludeStats(UserEntity entity) { if (entity == null) { return null; } UserModelIncludeStats model = new UserModelIncludeStats(); model.setUserModel(toUserModel(entity)); // UserModelIncludeStats 独有字段 model.setUserNum(7L); return model; } // 父类转换 public UserModel toUserModel(UserEntity entity) { if (entity == null) { return null; } UserModel model = new UserModel(); // 维护位置2 model.setUserId(entity.getUserId()); model.setName(entity.getName()); model.setPhone(entity.getPhone()); return model; } }
4.4 说明
此方案有两处维护,有时候会忘记维护【维护位置1】。
所以,我喜欢使用多态参数这种方案。
我是程序员娟娟,
致力将工作中遇到的问题和解决方案记录下来,
分享给更多需要的同行。
如果对你有帮助,不妨点个关注吧!