枚举进阶:从常量集合到业务逻辑承载者的实战扩展技巧

news2026/5/20 0:50:45
1. 项目概述从“能用”到“好用”的枚举进阶之路在软件开发中枚举Enum是我们再熟悉不过的基础工具了。它把一组有限的、具名的常量组织在一起让代码意图更清晰避免“魔法数字”满天飞。但不知道你有没有过这样的感觉项目里的枚举用着用着就有点“不够劲儿”了。比如一个订单状态枚举除了PENDING、PAID、SHIPPED这些值我们常常还需要为每个状态关联一个中文描述、一个颜色标识、一个允许的下一个状态列表甚至是一些业务逻辑方法。如果只是用最基础的枚举这些信息要么散落在各处要么就得写一堆switch-case代码很快就变得臃肿且难以维护。这就是“枚举类型的简单扩展学习”这个标题背后我们真正要探讨的核心问题。它不是一个高深莫测的算法研究而是聚焦于如何将我们日常开发中那个“朴实无华”的枚举通过一些简单、实用、优雅的扩展技巧变成一个功能更强大、更能贴合业务需求的“超级枚举”。这背后涉及的核心领域是编程语言特性应用与软件设计模式潜在需求是提升代码的表达力、可维护性和业务内聚性。无论是Java、C#、Python还是TypeScript虽然语法各异但面临的痛点和解决思路是相通的。这篇文章我就以一个在业务一线摸爬滚打了十多年的老码农视角跟你聊聊我是怎么看待和“折腾”枚举的。我们不谈那些华而不实的理论就聊怎么把枚举用得更“爽”怎么让它从简单的常量集合变成承载业务逻辑和信息的得力助手。无论你是刚入行的新手还是想优化自己代码库的老手相信都能从中找到一些可以直接“抄作业”的灵感。2. 核心思路超越常量的“富枚举”设计2.1 从基础枚举到“富枚举”的思维转变传统的枚举思维定势是“它就是一组常量”。比如定义一个用户角色public enum UserRole { ADMIN, EDITOR, VIEWER }这没问题很清晰。但当业务说“管理员的后台界面是蓝色的编辑是绿色的查看者是灰色的”或者“只有管理员可以删除用户”时新手可能会开始写// 不推荐的做法逻辑散落 public String getRoleColor(UserRole role) { switch(role) { case ADMIN: return “blue”; case EDITOR: return “green”; case VIEWER: return “gray”; default: return “black”; } } public boolean canDeleteUser(UserRole role) { return role UserRole.ADMIN; }这些方法被放在某个RoleService或工具类里。随着业务增长与角色相关的逻辑会散布在各个角落修改一个角色的属性需要翻遍整个代码库。“富枚举”Rich Enum或“行为枚举”的核心思路就是将与该枚举值紧密相关的数据和行为封装到枚举定义自身内部。让枚举实例不仅是一个标识符更是一个携带了状态和行为的对象。这符合面向对象“高内聚”的设计原则——把变化封装在一起。2.2 不同语言下的实现范式虽然目标一致但不同语言特性支持不同实现“富枚举”的姿势也各异。JavaJava的枚举本质上是类class的语法糖。每个枚举常量都是该类的一个实例。因此我们可以为枚举类添加字段、构造函数和方法这是实现“富枚举”最自然的方式。C#与Java类似C#的枚举enum是值类型但功能相对基础。要实现更丰富的功能通常需要配合“扩展方法”Extension Methods或者使用更强大的“源码生成器”来模拟。PythonPython 3.4 的Enum模块提供了功能丰富的枚举类。可以通过继承Enum并定义类属性或者使用auto()和自定义__new__方法来创建带有属性的枚举成员。TypeScriptTypeScript的枚举在编译后是双向映射的对象。要实现“富枚举”通常需要将枚举与常量对象as const和类型组合使用或者放弃传统enum语法采用“常量枚举对象类型守卫”的模式。我们接下来的讨论会以Java为主要示例语言因为它的语法对“富枚举”支持最为直观和经典其思想可以平移到其他语言。同时我也会穿插提及其他语言的实现关键点。3. 实战扩展一为枚举添加属性与自定义构造函数这是“富枚举”最基础也是最常用的一步。我们直接把描述、颜色、编码等属性“绑”在枚举常量上。3.1 Java实现示例订单状态枚举假设我们有一个订单状态每个状态需要状态值code、中文描述description、在UI中显示的颜色color。public enum OrderStatus { // 枚举常量声明实际上是在调用私有构造函数 PENDING(10, “待支付”, “#FFA726”), PAID(20, “已支付”, “#4CAF50”), SHIPPED(30, “已发货”, “#2196F3”), DELIVERED(40, “已送达”, “#9C27B0”), CANCELLED(99, “已取消”, “#9E9E9E”); // 私有字段用于存储每个枚举实例的属性 private final int code; private final String description; private final String color; // 私有构造函数用于初始化上述字段 private OrderStatus(int code, String description, String color) { this.code code; this.description description; this.color color; } // 对外提供的公共访问方法Getter public int getCode() { return this.code; } public String getDescription() { return this.description; } public String getColor() { return this.color; } // 一个常用的工具方法通过code反向查找枚举实例 public static OrderStatus fromCode(int code) { for (OrderStatus status : OrderStatus.values()) { if (status.code code) { return status; } } throw new IllegalArgumentException(“无效的订单状态码: ” code); } }实操要点与心得字段声明为final这确保了枚举实例的不可变性这是枚举线程安全和行为可预测的基石。一旦创建属性不可更改。构造函数设为private这是Java枚举的语法要求也符合设计逻辑——枚举实例只能在枚举内部定义外部无法new。提供Getter不提供Setter同样是为了保证不可变性。属性通过构造函数一次性注入后续只读。fromCode方法这是处理数据库存储、接口传输的利器。数据库里通常存的是code如20我们需要一个方法将其转换回枚举对象。这里用了简单的遍历如果枚举值很多可以考虑用静态Map进行缓存优化。Python实现瞥见在Python中你可以这样实现类似功能from enum import Enum class OrderStatus(Enum): PENDING (10, “待支付”, “#FFA726”) PAID (20, “已支付”, “#4CAF50”) # ... 其他状态 def __init__(self, code, desc, color): self._code code self._description desc self._color color property def code(self): return self._code property def description(self): return self._description classmethod def from_code(cls, code): for status in cls: if status.code code: return status raise ValueError(f“Invalid status code: {code}”)3.2 应用场景与价值前后端交互与数据展示后端接口直接返回枚举对象序列化框架如Jackson可以方便地将其code和description输出为JSON。前端直接使用description作为展示文本color用于标签着色无需再维护一套映射关系。数据库映射使用JPAHibernate时可以通过Converter注解自动将枚举的code属性与数据库整数字段进行转换。这样数据库存的是简洁的数字Java代码里用的是有意义的枚举对象。日志与监控打印日志时直接打印枚举其toString()默认是枚举名但如果重写toString()方法返回description日志可读性会大大提升。注意虽然可以为枚举添加很多属性但务必遵循“单一职责”原则。只添加与该枚举核心概念紧密相关的属性。不要把一个枚举变成“万能杂物箱”。例如OrderStatus枚举添加物流公司信息就不太合适。4. 实战扩展二在枚举中封装业务行为这是“富枚举”思想的精髓所在——让枚举自己“干活”。将原本散落在服务类或工具类中的、针对特定枚举值的逻辑收归到枚举内部。4.1 示例订单状态流转逻辑订单状态不是随意跳转的。比如“已取消”的订单不能再变成“已发货”。我们可以在枚举内部定义状态流转规则。public enum OrderStatus { PENDING(10, “待支付”, “#FFA726”) { Override public boolean canTransitionTo(OrderStatus nextStatus) { // 待支付状态只能转向 已支付 或 已取消 return nextStatus PAID || nextStatus CANCELLED; } }, PAID(20, “已支付”, “#4CAF50”) { Override public boolean canTransitionTo(OrderStatus nextStatus) { // 已支付状态只能转向 已发货 或 已取消退款 return nextStatus SHIPPED || nextStatus CANCELLED; } }, SHIPPED(30, “已发货”, “#2196F3”) { Override public boolean canTransitionTo(OrderStatus nextStatus) { return nextStatus DELIVERED; } }, DELIVERED(40, “已送达”, “#9C27B0”) { Override public boolean canTransitionTo(OrderStatus nextStatus) { // 已送达是终态不能转向其他状态 return false; } }, CANCELLED(99, “已取消”, “#9E9E9E”) { Override public boolean canTransitionTo(OrderStatus nextStatus) { // 已取消是终态 return false; } }; // ... 之前的属性字段和构造函数 ... // 定义一个抽象方法每个枚举常量都必须实现它 public abstract boolean canTransitionTo(OrderStatus nextStatus); // 一个实用的状态转换方法包含校验 public OrderStatus transitionTo(OrderStatus nextStatus) { if (!this.canTransitionTo(nextStatus)) { throw new IllegalStateException( String.format(“订单状态无法从[%s]转换到[%s]”, this.description, nextStatus.description) ); } // 这里可以添加其他钩子方法如状态转换前的检查、转换后的通知等 // beforeTransition(this, nextStatus); return nextStatus; } }代码解读与技巧抽象方法我们在枚举类级别声明了一个抽象方法canTransitionTo。这意味着每一个枚举常量PENDINGPAID...都必须提供自己的具体实现。这利用了Java枚举常量本质上是匿名子类的特性。常量特定方法实现在每个枚举常量的定义后面我们用花括号{}重写了canTransitionTo方法。这样流转规则就被牢牢地封装在了每个状态内部修改一个状态的流转逻辑不会影响到其他状态。transitionTo工具方法这是一个安全的、包含业务校验的状态转换方法。业务代码中调用currentStatus.transitionTo(targetStatus)如果非法会直接抛出异常。这比在业务服务里写一堆if-else清晰、安全得多。4.2 更复杂的行为策略模式与枚举结合有时候不同枚举值对应的行为逻辑比较复杂可能是一大段代码。这时可以在枚举内部定义策略接口。例如针对不同的用户角色计算折扣的策略不同public enum UserRole { VIP(0.8), // 8折 REGULAR(0.95), // 95折 GUEST(1.0); // 无折扣 private final DiscountStrategy discountStrategy; // 构造函数接收一个策略接口 UserRole(double discountRate) { this.discountStrategy (originalPrice) - originalPrice * discountRate; // 使用Lambda简化 } // 对外暴露一个应用折扣的方法 public double applyDiscount(double originalPrice) { return discountStrategy.calculate(originalPrice); } // 内部策略接口 private interface DiscountStrategy { double calculate(double originalPrice); } } // 使用double finalPrice userRole.applyDiscount(100.0);实操心得行为内聚最大的好处是当需要新增一个角色SVIP并打7折时你只需要在UserRole枚举中添加一行SVIP(0.7)所有相关的折扣逻辑就自动完成了。不需要去修改任何业务计算服务。易于测试因为逻辑被封装在枚举内部测试时可以非常方便地针对每个枚举值测试其行为无需构建复杂的上下文。清晰的责任链谁的数据谁的行为一目了然。新同事阅读代码能很快理解UserRole不仅仅是个标签它还知道怎么算折扣。5. 实战扩展三枚举集合、遍历与高级工具方法当枚举变得“富”起来之后我们经常需要基于它们的属性进行一些集合操作或批量判断。在枚举内部提供这些工具方法能极大提升使用便利性。5.1 基于属性的查找与过滤延续上面的OrderStatus我们可能经常需要做如下操作获取所有“终态”不可再流转的状态的列表。根据描述关键字查找状态。获取所有用于前台下拉框的选项code, description。与其每次都在业务代码里写循环不如在枚举内部一次搞定public enum OrderStatus { // ... 常量定义、属性、构造函数 ... // 静态的、缓存起来的集合避免每次调用都重新计算 private static final MapInteger, OrderStatus CODE_CACHE Arrays.stream(values()) .collect(Collectors.toMap(OrderStatus::getCode, Function.identity())); private static final ListOrderStatus FINAL_STATUSES Arrays.stream(values()) .filter(s - !s.canTransitionToAnyOther()) // 假设我们有一个方法判断是否为终态 .collect(Collectors.toList()); // 通过code查找优化版O(1)复杂度 public static OrderStatus fromCodeOptimized(int code) { OrderStatus status CODE_CACHE.get(code); if (status null) { throw new IllegalArgumentException(“无效的订单状态码: ” code); } return status; } // 获取所有终态 public static ListOrderStatus getFinalStatuses() { return new ArrayList(FINAL_STATUSES); // 返回副本以保证不可变性 } // 获取用于前端下拉框的DTO列表 public static ListStatusOption getOptions() { return Arrays.stream(values()) .map(s - new StatusOption(s.code, s.description)) .collect(Collectors.toList()); } // 一个简单的内部DTO public static class StatusOption { private final int value; private final String label; // ... 构造器和getter } // 辅助方法判断是否能转向任何其他状态 private boolean canTransitionToAnyOther() { return Arrays.stream(values()).anyMatch(other - other ! this this.canTransitionTo(other)); } }注意事项静态缓存像CODE_CACHE这样的静态Map在枚举类加载时初始化且内容永不改变是线程安全的。它极大地提升了根据code查找枚举实例的性能特别是枚举值较多时。返回副本getFinalStatuses()方法返回的是new ArrayList。这是因为直接返回静态集合的引用有风险调用者可能会意外地修改这个集合尽管里面是final的枚举实例但列表本身可修改。返回副本是一个防御性编程的好习惯。内部类StatusOption作为枚举的内部类非常合适因为它完全是服务于该枚举的。5.2 枚举与Stream API的配合Java 8的Stream API让枚举的批量操作如虎添翼。上面的例子已经大量使用了Arrays.stream(values())。再举一个常见的例子验证一个状态集合是否全部是终态。public static boolean areAllFinalStatuses(SetOrderStatus statuses) { return statuses.stream() .allMatch(FINAL_STATUSES::contains); // 或者更直接地使用枚举方法 // .allMatch(s - !s.canTransitionToAnyOther()); }6. 常见问题、陷阱与最佳实践实录在实际项目中应用“富枚举”这么多年我踩过不少坑也总结了一些让代码更健壮的经验。6.1 序列化与反序列化问题问题描述当你为枚举添加了自定义字段如code后使用JSON序列化框架如Jackson默认可能会序列化枚举的name()如“PENDING”而不是你想要的code。反序列化时框架可能无法根据code值还原成枚举对象。解决方案自定义序列化/反序列化器这是最彻底的方式。为你的枚举编写一个Jackson的JsonSerializer和JsonDeserializer。public class OrderStatusSerializer extends JsonSerializerOrderStatus { Override public void serialize(OrderStatus value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeNumber(value.getCode()); // 序列化为code } } public class OrderStatusDeserializer extends JsonDeserializerOrderStatus { Override public OrderStatus deserialize(JsonParser p, DeserializationContext ctx) throws IOException { int code p.getIntValue(); return OrderStatus.fromCode(code); // 根据code反序列化 } } // 在枚举类上使用注解 JsonSerialize(using OrderStatusSerializer.class) JsonDeserialize(using OrderStatusDeserializer.class) public enum OrderStatus { ... }使用JsonValue和JsonCreator推荐Jackson提供了更简洁的注解。public enum OrderStatus { // ... 常量 ... JsonValue // 标记此方法用于序列化 public int getCode() { return this.code; } JsonCreator // 标记此方法用于反序列化静态方法 public static OrderStatus fromCode(JsonProperty(“code”) int code) { return OrderStatus.fromCode(code); } }这样序列化时自动输出code反序列化时自动调用fromCode方法。数据库映射JPA类似地使用JPA时可以通过Converter注解定义一个属性转换器。6.2 单例与线程安全重要认知Java枚举实例是天然的、全局唯一的单例并且由JVM保证线程安全。这意味着你可以在枚举中安全地持有状态当然最好是final的。但是如果你的枚举方法操作了非final的静态字段或者有synchronized方法就需要谨慎考虑线程安全。不过在“富枚举”的典型用法中我们强调不可变性所以通常不会遇到这个问题。6.3 设计边界何时不该用“富枚举”“富枚举”虽好但不能滥用。行为过于复杂如果一个枚举常量对应的行为逻辑非常庞大涉及大量外部依赖如数据库查询、网络调用强行塞进枚举会导致枚举类臃肿不堪违背单一职责原则。这时应该考虑使用“策略模式”让枚举只负责选择策略复杂的逻辑由独立的策略类实现。属性频繁变化如果枚举关联的属性需要频繁修改比如颜色值每周都变那么每次修改都需要重新编译和部署包含该枚举的模块。这种情况下将这些配置外化到数据库或配置文件中可能是更好的选择枚举只保留核心的不变标识。跨模块共享如果一个枚举被多个不相关的模块使用并且每个模块需要为它添加不同的行为那么把这个枚举放在哪个模块都会造成尴尬。这时可能需要重新审视模块划分或者使用适配器模式来桥接。6.4 测试策略“富枚举”因为包含了业务逻辑所以也需要被测试。单元测试为枚举的每个工具方法如fromCode,canTransitionTo编写测试用例。行为测试为每个枚举常量特有的行为如上面例子中每个状态的流转规则编写测试。JUnit的ParameterizedTest配合EnumSource注解非常适合做枚举的遍历测试。ParameterizedTest EnumSource(OrderStatus.class) void testStatusHasValidColor(OrderStatus status) { assertNotNull(status.getColor()); assertTrue(status.getColor().matches(“^#[0-9A-Fa-f]{6}$”)); // 简单校验颜色格式 }7. 超越Java其他语言的枚举扩展思路7.1 TypeScript的“常量对象”模式TypeScript的enum在编译后会产生额外的代码且树摇优化不友好。在现代TS开发中更流行使用“常量对象 字面量类型联合”来模拟更安全的“富枚举”。// 定义常量对象和类型 const OrderStatus { PENDING: { code: 10, description: ‘待支付’, color: ‘#FFA726’ }, PAID: { code: 20, description: ‘已支付’, color: ‘#4CAF50’ }, // ... } as const; // ‘as const’ 断言让属性成为只读字面量 type OrderStatusCode typeof OrderStatus[keyof typeof OrderStatus][‘code’]; type OrderStatusType keyof typeof OrderStatus; // 使用 function getStatusDescription(code: OrderStatusCode): string { const statusEntry Object.values(OrderStatus).find(s s.code code); return statusEntry?.description ?? ‘未知状态’; } // 或者定义一个工具类来封装行为 class OrderStatusUtil { static canTransitionFrom(current: OrderStatusType, next: OrderStatusType): boolean { const rules: RecordOrderStatusType, OrderStatusType[] { PENDING: [‘PAID’, ‘CANCELLED’], PAID: [‘SHIPPED’, ‘CANCELLED’], // ... }; return rules[current]?.includes(next) ?? false; } }这种方式提供了完美的类型安全并且编译后的代码非常干净。7.2 C#的扩展方法C#的enum功能较弱但可以通过扩展方法为其“附加”行为。public enum OrderStatus { Pending 10, Paid 20, // ... } public static class OrderStatusExtensions { private static readonly DictionaryOrderStatus, string Descriptions new() { [OrderStatus.Pending] “待支付”, [OrderStatus.Paid] “已支付”, // ... }; private static readonly DictionaryOrderStatus, string Colors new() { [OrderStatus.Pending] “#FFA726”, // ... }; public static string GetDescription(this OrderStatus status) Descriptions[status]; public static string GetColor(this OrderStatus status) Colors[status]; public static bool CanTransitionTo(this OrderStatus current, OrderStatus next) { // ... 流转逻辑 } } // 使用status.GetDescription(); status.CanTransitionTo(OrderStatus.Paid);虽然不如Java的“富枚举”内聚但通过扩展方法也能实现类似的便捷调用并且将相关逻辑组织在了一起。枚举的扩展本质上是一种对代码表达力和内聚性的追求。它提醒我们即使是最基础的语言特性只要我们愿意多思考一步也能挖掘出巨大的潜力让代码变得更加清晰、健壮和优雅。下次当你定义枚举时不妨先停下来想想这个枚举是不是可以更“富”有一点

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…