Kotlin 通用请求接口设计:灵活处理多样化参数

在 Kotlin 中设计一个通用的 ControlParams 类来处理不同的控制参数,有几种常见的方法:方案1:使用密封类(Sealed Class)

sealed class ControlParamsdata class LightControlParams(val brightness: Int,val color: String
) : ControlParams()data class ThermostatControlParams(val temperature: Double,val mode: String
) : ControlParams()data class GenericControlParams(val parameters: Map<String, Any>
) : ControlParams()

方案2:使用泛型和类型参数

data class DeviceControlBody<T: ControlParams>(val timestamp: String,val deviceId: String,val params: T
)interface ControlParamsdata class LightParams(val on: Boolean,val brightness: Int
) : ControlParams

方案3:使用灵活的 Map 结构(最简单通用)

data class ControlParams(val params: Map<String, Any>
)// 使用示例
val controlBody = DeviceControlBody(timestamp = "2023-01-01T00:00:00",deviceId = "light-123",params = ControlParams(mapOf("brightness" to 80,"color" to "red"))
)

方案4:使用 JSON 字符串(与后端交互时常用)

data class ControlParams(val jsonParams: String
)// 使用示例
val paramsJson = """{"brightness": 80, "color": "red"}"""
val controlBody = DeviceControlBody(timestamp = "2023-01-01T00:00:00",deviceId = "light-123",params = ControlParams(paramsJson)
)

推荐方案
根据你的具体需求,我推荐以下方案:

如果参数结构明确且类型安全重要:使用密封类方案(方案1)

如果需要最大灵活性:使用 Map 结构(方案3)

如果需要与 REST API 简单交互:使用 JSON 字符串(方案4)

完整示例(推荐方案1 + 方案3结合):

// 基础控制参数接口
interface ControlParams// 特定设备参数
data class LightControlParams(val brightness: Int,val color: String
) : ControlParams// 通用参数实现
data class GenericControlParams(val parameters: Map<String, Any>
) : ControlParams// 设备控制请求体
data class DeviceControlBody(val timestamp: String,val deviceId: String,val params: ControlParams
)// 使用示例
fun main() {// 特定设备控制val lightControl = DeviceControlBody("2023-01-01T00:00:00","light-123",LightControlParams(80, "red"))// 通用设备控制val genericControl = DeviceControlBody("2023-01-01T00:00:00","device-xyz",GenericControlParams(mapOf("speed" to 5, "mode" to "auto")))
}

这种设计既保持了类型安全,又提供了足够的灵活性来处理不同的设备控制参数。

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

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

相关文章

aspark 配置2

编写Hadoop集群启停脚本 1.建立新文件&#xff0c;编写脚本程序 在hadoop101中操作&#xff0c;在/root/bin下新建文件&#xff1a;myhadoop&#xff0c;输入如下内容&#xff1a; 2.分发执行权限 保存后退出&#xff0c;然后赋予脚本执行权限 [roothadoop101 ~]$ chmod x /r…

Webstorm 使用搜不到node_modules下的JS内容 TS项目按Ctrl无法跳转到函数实现

将node_modules标记为不排除&#xff0c;此时要把内存改大&#xff0c;不然webstorm中途建立索引时&#xff0c;会因为内存不足&#xff0c;导致索引中途停止&#xff0c;造成后续搜索不出来 更改使用内存设置 内存调为4096 若出现搜不出来js内容时&#xff0c;请直接重启下该项…

vue-element-plus-admin的安装

文档链接&#xff1a;开始 | vue-element-plus-admin 之前尝试按照官方文档来安装&#xff0c;运行npm run dev命令却不能正常打开访问浏览器&#xff0c;换一个方式 首先在目录下打开命令窗口 1、克隆项目 从 GitHub 获取代码 # clone 代码 git clone https://github.com…

【windows10】基于SSH反向隧道公网ip端口实现远程桌面

【windows10】基于SSH反向隧道公网ip端口实现远程桌面 1.背景2.SSH反向隧道3.远程连接电脑 1.背景 ‌Windows 10远程桌面协议的简称是RDP&#xff08;Remote Desktop Protocol&#xff09;‌。 RDP是一种网络协议&#xff0c;允许用户远程访问和操作另一台计算机。 远程桌面功…

软考系统架构设计师之大数据与人工智能笔记

一、大数据架构设计 1. 核心概念与挑战 大数据特征&#xff1a;体量大&#xff08;Volume&#xff09;、多样性&#xff08;Variety&#xff09;、高速性&#xff08;Velocity&#xff09;、价值密度低&#xff08;Value&#xff09;。传统数据库问题&#xff1a;数据过载、性…

【数据结构 · 初阶】- 单链表

目录 一.相关指针知识点 二.链表 1.为什么学了顺序表还要学链表 2.优点 三.实现 1.链表的打印 —— 理解链表结构 (2) 物理结构图 2.链表的尾插 —— 入门 错误写法&#xff1a;tail ! NULL 总结&#xff1a; 正确代码物理图解&#xff1a; (2) 尾插整体代码 (思考…

按键消抖(用状态机实现)

基于状态机的设计代码 module key_filter(clk,rst,key,key_p_flag,key_r_flag,key_state);input clk,rst;input key;output reg key_p_flag;output reg key_r_flag;output reg key_state;reg [1:0]r_key; //后面用来判断什么时候pedge&#xff0c;什么时候nedgealways…

大数据(7.2)Kafka万亿级数据洪流下的架构优化实战:从参数调优到集群治理

目录 一、海量数据场景下的性能之殇1.1 互联网企业的数据增长曲线1.2 典型性能瓶颈分析 二、生产者端极致优化2.1 批量发送黄金法则2.1.1 分区选择算法对比 2.2 序列化性能突破 三、消费者端并发艺术3.1 多线程消费模式演进3.1.1 消费组Rebalance优化 3.2 位移管理高阶技巧 四、…

MyBatis深度解析与实战指南:细节完整,从入门到精通

MyBatis深度解析与实战指南&#xff1a;细节完整&#xff0c;从入门到精通 整理这份笔记&#xff0c;是因为学习 MyBatis 时发现很多教程要么只讲基础 CRUD&#xff0c;要么直接跳到 Spring 整合&#xff0c;对 MyBatis 核心特性讲解不全面&#xff0c;基础部分也不够完整。实…

【科学技术部政务服务平台-用户注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【Audio开发三】音频audio中帧frameSize ,周期大小periodsize,缓冲区buffer原理详解以及代码流程分析

一、基础概述 在分析获取最小帧数前&#xff0c;我们先来了解几个相关的概念。 1&#xff0c;帧 帧&#xff08;frame&#xff09;&#xff1a;表示一个完整的声音单元&#xff0c;所谓的声音单元是指一个采样样本。如果是双声道&#xff0c;那么一个完整的声音单元就是 2 个样…

K8S学习之基础七十五:istio实现灰度发布

istio实现灰度发布 上传镜像到harbor 创建两个版本的pod vi deployment-v1.yaml apiVersion: apps/v1 kind: Deployment metadata:name: appv1labels:app: v1 spec:replicas: 1selector:matchLabels:app: v1apply: canarytemplate:metadata:labels:app: v1apply: canaryspec…

C++蓝桥杯填空题(攻克版)

片头 嗨~小伙伴们&#xff0c;咱们继续攻克填空题&#xff0c;先把5分拿到手~ 第1题 数位递增的数 这道题&#xff0c;需要我们计算在整数 1 至 n 中有多少个数位递增的数。 什么是数位递增的数呢&#xff1f;一个正整数如果任何一个数位不大于右边相邻的数位。比如&#xf…

【Python】数据结构

【Python】数据结构&#xff1a; Series&#xff1a;1、通过列表创建Series类对象2、显示地给数据指定标签索引3、通过字典创建Series类对象4、获取索引5、获取数据 DataFrame&#xff1a;1、通过数组创建一个DataFrame类对象2、指定列索引3、指定行索引4、获取列的数据5、查看…

Android XML布局与Compose组件对照手册

下面我将详细列出传统 XML 布局中的组件与 Compose 组件的对应关系&#xff0c;帮助您更好地进行迁移或混合开发。 基础布局对应 XML 布局Compose 组件说明LinearLayout (vertical)Column垂直排列子项LinearLayout (horizontal)Row水平排列子项FrameLayoutBox层叠子项Relativ…

云原生运维在 2025 年的发展蓝图

随着云计算技术的不断发展和普及&#xff0c;云原生已经成为了现代应用开发和运维的主流趋势。云原生运维是指在云原生环境下&#xff0c;对应用进行部署、监控、管理和优化的过程。在 2025 年&#xff0c;云原生运维将迎来更加广阔的发展前景&#xff0c;同时也将面临着一系列…

js day5

复习模板字符串&#xff1a; 在输出语句里面 document.write(我今年${a}岁了)中间是反引号&#xff1b;里面是${变量}&#xff1b; 复习基本类型 number String null undefined boolean 检测数据类型输出typedf 变量则可&#xff1b; 添加链接描述 复习样式变量table什么的边…

SmolVLM2: The Smollest Video Model Ever(三)

这是对《SmolLM2: When Smol Goes Big — Data-Centric Training of a Small Language Model》的翻译阅读 摘要 虽然大语言模型在人工智能的许多应用中取得了突破&#xff0c;但其固有的大规模特性使得它们在计算上成本高昂&#xff0c;并且在资源受限的环境中部署具有挑战性。…

汽车软件开发常用的需求管理工具汇总

目录 往期推荐 DOORS&#xff08;IBM &#xff09; 行业应用企业&#xff1a; 应用背景&#xff1a; 主要特点&#xff1a; Polarion ALM&#xff08;Siemens&#xff09; 行业应用企业&#xff1a; 应用背景&#xff1a; 主要特点&#xff1a; Codebeamer ALM&#x…

爬虫工程师杂活工具人

30岁的年龄;这个年龄大家都是成年人;都是做父母的年龄了;你再工位上的心态会发生很大变化的; 爬虫工程师基本都是如此;社会最low的一帮连销售都做不了的;单子都开不出来的然后转行做爬虫工程师的;这样的人基本不太和社会接触; 你作为爬虫初级工程师就敲着键盘然后解析着html;…