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;}// 维护位置1model.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】。

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


我是程序员娟娟,

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

分享给更多需要的同行。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang线程池与协程池

引言 Golang是一门强大的编程语言,特别适用于构建高性能、并发性能强的应用程序。在Golang中,线程池和协程池是非常常见且重要的概念,它们可以提高应用程序的并发处理能力和性能,减少资源的浪费。本文将介绍Golang中的线程池和协…

Java八股文面试全套真题【含答案】-JSON篇

什么是JSON? 答案:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于JavaScript的对象字面量表示法,用于在不同语言和平台之间传输数据。JSON的数据结构是怎样的? 答案&#xf…

LeetCode103. Binary Tree Zigzag Level Order Traversal

文章目录 一、题目二、题解 一、题目 Given the root of a binary tree, return the zigzag level order traversal of its nodes’ values. (i.e., from left to right, then right to left for the next level and alternate between). Example 1: Input: root [3,9,20,n…

HTTP 缓存机制

一、强制缓存 只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存而无需再请求服务器。 强制缓存是利用下面这两个 HTTP 响应头部(Response Header)字段实现的,它们都用来表示资源在客户端缓存的有效期: Cache…

Python基础快速过一遍

文章目录 一、变量及基本概念1、变量2、变量类型3、变量格式化输出4、type()函数5、input()函数6、类型转换函数7、注释 二、Python运算/字符1、算数运算2、比较运算3、逻辑运算4、赋值运算符5、转义字符6、成员运算符 三、判断/循环语句1、if判断语句2、while循环语句3、for循…

.NET8 依赖注入

依赖注入(Dependency Injection,简称DI)是一种设计模式,用于解耦组件(服务)之间的依赖关系。它通过将依赖关系的创建和管理交给外部容器来实现,而不是在组件(服务)内部直…

等保测评报价相差很大,里面有什么门道

等保测评报价的差异主要源于以下几点: 服务质量评估标准不同:不同的测评机构在测评过程中所提供的服务范围、深度、细节等方面可能存在差异,因此导致报价有所不同。一些机构可能提供全面且细致的测评服务,致力于提供高质量的等保测…

openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数

文章目录 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数139.1 操作步骤139.2 异常处理 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数 如果应用程序与数据库的连接数超过最大值,则新的连接无法建立。建议每天检查连…

一种结构新颖的双通带超导滤波器设计

闫鑫1,2,季来运1,张浩1,2,李颢毅1,2,王昭月1,2,曹凤莹1,2 (1.天津海芯电子有限公司,天津300380;2.天津师范大学物理与材料科学学院,天津 300387.) 摘要&…

前端dark主题的快速构建与切换

首先在全局css样式中增加一个 dark 模式即可,主要就是filter这个属性, invert(1);则表示100%完全反转样式,通俗点就是颠倒黑白,白的让它变成黑的,黑的让它变成白的。 css中的filter函数总结 filter:invert(1);数值范围…

Leetcode题库(数据库合集)_ 难度:简单

目录 难度:简单1. 组合两个表2. 第二高的薪水3. 第N高的薪水4. 分数排名5. 连续出现的数字6. 超过经理收入的员工7. 重新8. 寻找用户推荐人9. 销售员10. 排名靠前的旅行者11. 患某种疾病的患者12. 修复表中的名字13. 求关注者的数量14. 可回收且低脂的产品15. 计算特…

前后端参数传递总结

1、 页面参数 js传递参数 渲染表格 页面控制器(前端) 后端控制器 后端服务 实体赋值 2、跟踪情况

场景实践 | 法大大落地业财一体化,优化流程结构

2023 年,法大大作为中国电子签行业唯一上榜《2023胡润全球未来独角兽》企业,同时上榜“2022深圳市潜在科技独角兽企业榜单”。作为高速发展的高科技服务企业,法大大自2021年完成9亿元腾讯D轮融资后,建立了长期主义发展计划&#x…

计算机基础知识63

Django的条件查询&#xff1a;查询函数 exclude exclude&#xff1a;返回不满足条件的数据 res Author.objects.exclude(pk1) print(res) # <QuerySet [<Author: Author object (2)>, <Author: Author object (3)>]> order_by 1、按照 id 升序排序 res …

【Seata源码学习 】篇六 全局事务提交与回滚

【Seata源码学习 】篇六 全局事务提交与回滚 全局事务提交 TM在RPC远程调用RM后,如果没有出现异常&#xff0c;将向TC发送提交全局事务请求io.seata.tm.api.TransactionalTemplate#execute public Object execute(TransactionalExecutor business) throws Throwable {// 1. …

Naco安装、配置、交互

1. Docker安装Naco 官方文档https://nacos.io/zh-cn/docs/quick-start-docker.html&#xff0c;然而自己部署的时候遇到了“Database not set”的问题。有可能是因为环境中已经部署了3306的mysql服务导致的。&#xff08;虽然我尝试修改了naco的docker-compose&#xff0c;但是…

【离散数学】——期末刷题题库(集合)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

【FPGA】Verilog:二进制并行加法器 | 超前进位 | 实现 4 位二进制并行加法器和减法器 | MSI/LSI 运算电路

Ⅰ. 前置知识 0x00 并行加法器和减法器 如果我们要对 4 位加法器和减法器进行关于二进制并行运算功能&#xff0c;可以通过将加法器和减法器以 N 个并行连接的方式&#xff0c;创建一个执行 N 位加法和减法运算的电路。 4 位二进制并行加法器 4 位二进制并行减法器 换…

内存是如何工作的

一、什么是内存 从外观上辨识&#xff0c;它就是内存条&#xff1b;从硬件上讲&#xff0c;它叫RAM&#xff0c;翻译过来叫随机存储器。英文全称&#xff1a;Random Access Memory。它也叫主存&#xff0c;是与CPU直接交换数据的内部存储器。其特点是读写速度快&#xff0c;不…

JSX语法

文章目录 1.JSX是什么2.JSX书写规范3.JSX中显示数据4.添加样式隔离作用域 5.条件渲染6.列表渲染7.响应事件8.更新页面 1.JSX是什么 JSX是一种JavaScript的语法扩展用于描述页面,并且可以和JavaScript融合在一起不同于Vue的模板语法,没有Vue中的一些指令(v-if,v-show,v-for)在r…