java利用多态参数实现数据转换

目录

一、应用场景描述

二、理论说明

2.1 多态参数的定义

2.1 什么是父类引用指向子类对象?

三、方案呈现(推荐使用)

3.1 下层数据

3.2 本层数据

(1)父类UserModel

(2)子类UserModelIncludeStats

3.3 数据转换

3.4 说明

四、笨方案展示(不推荐)

4.1 下层数据

4.2 本层数据

(1)父类UserModel

(2)子类UserModelIncludeStats

4.3 数据转换

4.4 说明


一、应用场景描述

一个项目中,可能有多层数据。

在每层数据中,都会跟下层数据进行数据转换。

那么这时候,如何进行数据转换能简单高效,维护(增删字段时的修改)还轻松呢?

最近,我找到了【多态参数】,我觉得比我的笨方法好用,降低了我的维护成本。

二、理论说明

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】。

所以,我喜欢使用多态参数这种方案。


我是程序员娟娟,

致力将工作中遇到的问题和解决方案记录下来,

分享给更多需要的同行。

如果对你有帮助,不妨点个关注吧!

  • 33
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值