【Java高级特性实战】:用Java 19密封记录类构建不可变且受限的继承体系

第一章:Java 19密封记录类的核心概念与设计动机

Java 19引入了密封类(Sealed Classes)与记录类(Records)的结合能力,使得开发者能够更精确地控制类的继承结构。这一特性在构建领域模型或处理有限变体类型时尤为强大,允许类明确声明哪些子类可以扩展它,从而增强封装性与类型安全性。

密封记录类的设计初衷

在复杂的业务系统中,开发者常需定义一组封闭的、可枚举的数据结构变体。传统的接口或多态实现容易导致类型失控,而密封类通过限制继承链,确保所有可能的子类型在编译期就已知。当与记录类结合时,这种模式进一步简化了不可变数据载体的定义。 例如,表示几何形状的类型族可以被严格限定:

public sealed interface Shape permits Circle, Rectangle, Triangle {}

public record Circle(double radius) implements Shape {}
public record Rectangle(double width, double height) implements Shape {}
public record Triangle(double a, double b, double c) implements Shape {}
上述代码中,Shape 接口被声明为 sealed,并通过 permits 明确列出允许实现它的记录类。每个记录类自动获得不可变属性和结构化 equals/hashCode 实现,极大减少样板代码。

为何选择密封记录类

  • 提升类型安全:编译器可对 switch 表达式进行穷尽性检查
  • 优化模式匹配:结合 instanceof 模式匹配,减少运行时错误
  • 增强API可维护性:防止外部未知实现破坏设计契约
特性传统类继承密封记录类
继承控制开放扩展显式许可
数据封装手动实现自动生成
类型完整性弱保证编译期验证
该机制特别适用于DSL、解析器、状态机等需要封闭类型层次的场景。

第二章:密封类与记录类的语言特性解析

2.1 密封类的语法结构与permits机制详解

密封类(Sealed Classes)是Java 17引入的重要特性,用于限制类的继承体系。通过`sealed`修饰类,并配合`permits`关键字,明确指定哪些类可以继承它。
基本语法结构
public sealed class Shape permits Circle, Rectangle, Triangle {
    // 抽象形状类
}
上述代码定义了一个密封类`Shape`,仅允许`Circle`、`Rectangle`和`Triangle`三个类继承。`permits`后列出的类必须直接继承该密封类。
子类约束规则
  • 每个被`permits`允许的子类必须使用`final`、`sealed`或`non-sealed`之一进行修饰;
  • 若子类为`final`,则不可再被继承;
  • 若为`non-sealed`,则开放继承权限给其他类。
此机制增强了封装性,使开发者能精确控制类型扩展,提升安全性和可维护性。

2.2 记录类的不可变语义与自动成员生成原理

记录类(record)在现代编程语言中被设计为不可变数据载体,其核心语义在于创建后状态不可更改,确保线程安全与数据一致性。
不可变性保障
通过编译器自动生成私有字段与仅含 getter 的访问器,记录类禁止外部修改内部状态。例如在 Java 中:
public record Person(String name, int age) {}
上述代码中,name 与 age 被隐式声明为 final,构造函数由编译器统一注入,杜绝中途篡改。
自动成员生成机制
记录类自动合成 equals()、hashCode() 与 toString() 方法,依据声明的字段进行结构化计算。其逻辑等价于:
  • 所有字段参与 equals 比较
  • hashCode 基于字段值联合计算
  • toString 输出格式为 "Person[name=..., age=...]"
该机制减少样板代码,提升类型安全性与开发效率。

2.3 密封性与不可变性的协同优势分析

密封性确保对象结构不被扩展或修改,而不可变性保证其状态一旦创建便不可更改。两者结合可构建高度可靠的系统组件。
协同机制示例
const createUser = (name, age) => 
  Object.freeze({
    name,
    age,
    updateAge(newAge) {
      return createUser(name, newAge);
    }
  });
上述代码通过 Object.freeze 实现密封性与值不可变性。调用 updateAge 不会修改原对象,而是返回新实例,避免副作用。
核心优势对比
特性密封性不可变性协同效果
属性修改允许(若非只读)禁止完全封锁状态变更
结构扩展禁止禁止防止意外增删字段

2.4 sealed class与record的字节码层面探秘

Java中的`sealed`类和`record`在编译后会生成特定的字节码结构,揭示了语言特性背后的实现机制。
sealed class的字节码特征
通过`javac`编译后,`sealed`类使用`ACC_FINAL`、`ACC_SUPER`以及新增的`ACC_SEALED`标志位,并通过`permits`指定允许的子类。反编译可见:

public abstract sealed class Shape permits Circle, Rectangle {}
编译后`ClassFile`结构中包含`PermittedSubclasses`属性,列出`Circle`和`Rectangle`,JVM据此强制继承限制。
record的字节码简化机制
`record`在字节码层面自动生成构造器、`equals()`、`hashCode()`和`toString()`。例如:

public record Point(int x, int y) {}
其字节码包含私有final字段、公共访问器、以及合成的`canonical constructor`,等价于手动编写POJO但更高效。
  • sealed class依赖`PermittedSubclasses`元数据实现安全继承
  • record通过编译器生成代码减少样板,运行时无特殊指令

2.5 模式匹配对密封类型体系的支持预览

Java 19 引入了模式匹配(Pattern Matching)对密封类(Sealed Classes)的增强支持,显著提升了类型检查的表达力与安全性。密封类通过 permits 明确限定子类型,结合 instanceof 的模式匹配,可实现无冗余强制转换的分支逻辑。
语法简化与类型推导

if (shape instanceof Circle c) {
    return c.radius() * c.radius() * Math.PI;
} else if (shape instanceof Rectangle r) {
    return r.width() * r.height();
}
上述代码中,c 和 r 在匹配成功后自动完成类型推导,无需显式转型。编译器利用密封类的封闭性,确保所有子类已被穷尽处理。
编译时完备性检查
对于 switch 表达式,若密封类的所有子类未被覆盖,编译器将报错:
  • Circle — 处理圆形逻辑
  • Rectangle — 处理矩形逻辑
  • Square — 必须显式处理或使用默认分支

第三章:构建受限继承体系的设计实践

3.1 领域建模中封闭类层次的识别与划分

在领域驱动设计中,封闭类层次用于表达一组固定的、互斥的子类型关系,确保领域模型的完整性与可维护性。
识别封闭类层次的信号
当业务规则要求某抽象概念只能由有限且明确的实现构成时,应考虑构建封闭类层次。常见场景包括订单状态、支付方式、用户角色等。
  • 存在大量条件判断(如 if-else 或 switch)基于类型分支
  • 新增子类需修改多个调用方逻辑
  • 需要保证编译期穷尽性检查
代码结构示例

sealed class PaymentMethod
data class CreditCard(val lastFour: String) : PaymentMethod()
data class Alipay(val accountId: String) : PaymentMethod()
data class WeChatPay(val openid: String) : PaymentMethod()
上述 Kotlin 示例中,PaymentMethod 为密封类,其所有子类必须与其同处一个模块内。编译器可据此推断 when 表达式的分支是否穷尽,提升类型安全性与重构便利性。

3.2 使用密封记录类表达代数数据类型(ADT)

在现代Java中,密封类(sealed classes)结合记录类(records)为代数数据类型(ADT)提供了优雅的建模方式。通过限制继承体系,可确保类型安全并简化模式匹配逻辑。
密封记录类的基本结构
public sealed interface Expr permits Constant, Addition {
}

public record Constant(int value) implements Expr {
}

public record Addition(Expr left, Expr right) implements Expr {
}
上述代码定义了一个密封接口 Expr,仅允许 Constant 和 Addition 两种实现。记录类自动提供不可变字段与结构化构造。
模式匹配与类型穷举
使用 switch 表达式可对ADT进行安全分支处理:
int evaluate(Expr expr) {
    return switch (expr) {
        case Constant c -> c.value();
        case Addition a -> evaluate(a.left()) + evaluate(a.right());
    };
}
编译器能验证所有子类型均已覆盖,避免遗漏情况,提升代码健壮性。

3.3 替代枚举与抽象类的传统设计方案对比

在类型安全与可扩展性之间,传统设计常依赖抽象类或枚举实现多态行为。然而,现代语言特性提供了更简洁的替代方案。
传统方式:抽象类实现策略模式

abstract class PaymentMethod {
    public abstract void process(double amount);
}

class CreditCard extends PaymentMethod {
    public void process(double amount) {
        System.out.println("Processing $" + amount + " via Credit Card");
    }
}
该方式通过继承实现行为多态,但类层次复杂,扩展需新增子类,违反开闭原则。
现代替代:密封类与代数数据类型
  • 密封类限制子类数量,提升类型安全性
  • 结合模式匹配简化条件逻辑
  • 避免运行时类型检查开销
相比枚举无法携带差异化行为数据,密封类既能限定类型集合,又能为每种情况定义独特数据结构,是更优的建模工具。

第四章:真实业务场景中的应用案例

4.1 网络请求响应类型的统一建模与处理

在现代前后端分离架构中,网络请求的响应数据需要进行统一建模,以提升前端处理的一致性和可维护性。通过定义标准化的响应结构,可以有效解耦业务逻辑与网络层。
统一响应结构设计
通常采用包含状态码、消息和数据体的三段式结构:
{
  "code": 200,
  "message": "请求成功",
  "data": {
    "userId": 123,
    "username": "alice"
  }
}
其中,code用于标识业务或HTTP状态,message提供可读提示,data封装实际返回内容。该结构便于拦截器统一处理错误和加载状态。
前端响应处理策略
使用拦截器对响应进行预处理,根据code字段判断是否跳转登录或提示错误。常见状态码可通过映射表管理:
状态码含义处理方式
200成功返回data
401未授权跳转登录
500服务器错误提示异常

4.2 金融交易状态机的状态不可变表示

在金融交易系统中,状态机的不可变性是确保数据一致性和审计追溯的关键。通过将每个状态变更建模为新的状态实例,而非修改原有状态,可避免并发更新导致的数据竞态。
状态不可变设计示例
type TransactionState struct {
    ID        string
    Status    string
    Timestamp time.Time
    Metadata  map[string]interface{}
}

func (s *TransactionState) Transition(newStatus string) *TransactionState {
    return &TransactionState{
        ID:        s.ID,
        Status:    newStatus,
        Timestamp: time.Now(),
        Metadata:  copyMap(s.Metadata),
    }
}
上述代码中,Transition 方法不修改原状态,而是返回一个包含新状态的新实例。这保证了历史状态的完整性,便于回溯和重放。
优势与应用场景
  • 支持事件溯源(Event Sourcing),所有状态变更可追溯;
  • 天然兼容分布式系统中的并发访问;
  • 简化回滚逻辑,可通过状态快照实现精确恢复。

4.3 游戏开发中角色行为类型的受限扩展

在游戏设计中,角色行为的扩展常需在预设框架内进行,以确保逻辑一致性与系统稳定性。通过接口或抽象基类限定行为契约,可实现安全的扩展机制。
行为接口定义

public interface ICharacterBehavior {
    void Execute(Character context); // 执行行为逻辑
    bool CanExecute(Character context); // 判断是否可执行
}
该接口规范了所有可扩展行为的调用方式,Execute 方法接收角色上下文,CanExecute 用于前置条件校验,避免非法状态转移。
受限注册机制
  • 仅允许通过行为工厂注册新类型
  • 运行时禁止动态注入未经验证的行为
  • 所有行为需继承自受控基类并实现审计日志

4.4 基于模式匹配的密封类型安全转换实践

在现代类型系统中,密封类型(sealed types)结合模式匹配可实现类型安全的分支处理。通过限定继承层级,编译器能穷尽判断所有子类型,提升转换可靠性。
密封类型的定义与使用

public sealed interface Result
    permits Success, Failure {}

public record Success(String data) implements Result {}
public record Failure(String error) implements Result {}
上述代码定义了一个密封接口 Result,仅允许 Success 和 Failure 实现,确保类型边界可控。
模式匹配实现安全转换
  • 避免传统 instanceof 类型检查的冗余代码
  • 编译器可验证所有分支是否覆盖全部子类型

String process(Result result) {
    return switch (result) {
        case Success(String data) -> "成功: " + data;
        case Failure(String error) -> "失败: " + error;
    };
}
该 switch 表达式利用解构语法提取数据,无需强制转型,逻辑清晰且类型安全。

第五章:未来演进方向与架构设计启示

云原生架构的深度整合
现代系统设计正加速向云原生范式迁移。Kubernetes 已成为容器编排的事实标准,服务网格(如 Istio)通过 sidecar 代理实现流量控制、安全通信与可观察性。实际案例中,某金融平台将核心交易系统迁移到基于 K8s 的微服务架构后,部署效率提升 60%,故障恢复时间缩短至秒级。
  • 采用声明式 API 管理基础设施
  • 利用 Operator 模式自动化运维复杂中间件
  • 实施 GitOps 实现持续交付流水线
边缘计算驱动的架构变革
随着 IoT 设备激增,数据处理正从中心云向边缘下沉。某智能制造企业部署边缘节点,在本地完成设备数据预处理与实时分析,仅将聚合结果上传云端,带宽消耗降低 75%。
架构模式延迟适用场景
集中式云计算100ms+批量分析、报表生成
边缘计算<10ms实时控制、视频分析
可观察性体系的工程实践
在高并发系统中,传统日志已不足以支撑问题定位。需构建三位一体的可观察性平台:

// 使用 OpenTelemetry 进行分布式追踪
tp := otel.TracerProviderWithResource(resource.NewWithAttributes(
    schema.SchemaURL,
    semconv.ServiceName("payments-api"),
))
otel.SetTracerProvider(tp)

tracer := tp.Tracer("payment-processor")
ctx, span := tracer.Start(ctx, "ProcessPayment")
defer span.End()
Distributed Tracing Dashboard
World Action Model:经典论文 郑困时,图prorpt为机量人压务时,退过驱制解弱词表(constrsinsd decoding), 强附模型只从.256个者动作token中保H, B象总注活地。始VLA之一,RT-2使用了大量的五联网VQ据与少里的机械网的AcSonDat行CoFine-Tunng, 独组sl, 共i744个episode,Mous使用三个专累模,分是vidogonmedel,actonesget,understandng。包的核定之的的观到沟血黄动作,预之后现(vorlemodel),tseing,2。 阅读详情

相关推荐

时序分析-由D触发器结构来理解Tsu、Th

FPGA逻辑单元内的D触发器(D-FF)是一种在时钟的上升沿(或下降沿)将输入信号的变化传送至输出的边沿触发器。 数字电子技术基础-闫石(第五版)边沿D触发器内部结构见下图: 而FPGA原理与结构(日)一书中,内部结构较之上图多了俩反相器: 由传输门和俩个反相器组成一个循环电路(锁存器),再由前后两级锁存器按主从结构链接而成。这里的传输门起开关作用,随着CLK的状态变化切换开关。只看输出的话,前级锁存器的值会随着时钟输入的变化井然有序地传入后级锁存器。为了防止时钟信号变化时输入信号发生冒险,从而使稳定.

XY_Chang的博客 3973

揭秘Java 19密封类设计内幕:记录类为何受限?

掌握Java 19密封类设计精髓,解析记录类继承限制难题。深入探讨Java 19密封类的记录实现限制,涵盖适用场景与核心语法,确保类型安全与代码简洁性,提升系统可维护性,值得收藏。

DebugLoom的博客 868

深入掌握英飞凌TriCore中断向量表

摘要:本文探讨了英飞凌Tc277芯片中断机制的原理与实现,重点解析了中断向量表基地址的链接文件定义方式、BIV寄存器的初始化过程以及每个中断条目的32字节空间分配规则。通过分析中断向量号(1-255)的计算方法,阐明了中断条目跳转地址(如STM0中断向量号37对应0x800F04A0)的生成逻辑。文章还揭示了.map文件中14字节跳转指令的组成原理,以及最终通过a14寄存器跳转到实际中断函数(如stm0Sr0ISR)的执行流程,为嵌入式开发人员理解中断处理机制提供了清晰的技术路径。

IT技术猿猴的博客 1713

Java 19密封类新规则,记录类终于可以合法“继承”了?

Java 19密封类允许记录类实现,解决类型安全与扩展性矛盾。支持记录类作为密封类的合法子类型,提升模式匹配效率,增强代码可读性与维护性。适用于领域模型设计等场景,点击了解新特性用法,值得收藏。

QuickCode的博客 770

从零开始的机械臂yolov5抓取gazebo仿真(一)

本文介绍了如何将机械臂模型导出为URDF

qq_48427527的博客 1万+

第95章 安全工程师:Shell 脚本实现安全扫描、漏洞检测、日志审计

随着网络安全威胁日益复杂,传统的手动安全管理已无法满足现代企业的安全需求。Shell 脚本为安全工程师提供了强大的自动化能力,能够实现 7×24 小时的安全监控、快速漏洞扫描、智能日志分析和实时威胁响应。本章将系统介绍如何使用 Shell 脚本构建完整的安全防护体系,从基线检查到实时监控,帮助你打造自动化的安全运维能力。

猪猪侠 90

密封类+记录类=完美组合?Java 19中你不能忽略的3个约束条件

掌握Java 19密封类与记录类协同使用的关键,深入解析Java 19密封类的记录实现限制。涵盖适用场景、继承规则与模式匹配优化,提升代码安全性与可读性。三大约束条件详解,助你写出更优雅的结构化类型,值得收藏。

ProceNest的博客 613

购物车智能检测系统:YOLO26 + PyQt5 毕设实现

YOLO26 + PyQt5 完成购物车商品检测系统:标注数据集(OpenImages 筛选 + 自制 500 张),训练 100 epoch 得到 mAP50 约 0.89,集成商品定价后输出总价。建议先用 OpenImages 预训练权重在自制数据上调优(冻住 backbone 前 50 epoch),等 loss 稳定后再解冻全量训练。

m0_64661770的博客 56

Java 19密封类开放记录类实现:打破限制的3个关键优势

Java 19密封类允许记录类实现,提升类型安全与设计灵活性。支持在密封继承体系中使用记录类,简化不可变数据模型的定义,适用于领域建模与模式匹配场景。三大优势包括更清晰的类层次控制、更简洁的代码表达、更强的编译时检查。架构优化新选择,值得收藏。

DebugVibe的博客 573

UniRx之基本语法格式

想要更好的去学习UniRx,我们最好是先理解UniRx 的语法格式。就像我们去学习英语或者汉语一样,理解了基本的语法规则后,再学其他的就信手拈来了。

TxNet 924

UCIE Specification详解(二)

UCIe架构概述。

Crazzy_M的博客 3299

Java 19密封类限制全解析(记录类实现受限的底层原理)

深入解析Java 19密封类的记录实现限制,揭示其底层原理与设计约束。涵盖密封类与记录类结合的适用场景、核心语法及类型安全优势,帮助开发者规避继承滥用问题。掌握这一机制,提升代码可维护性与封装性,值得收藏。

InstrGap的博客 376

【乐企】开票控制服务

例子:企业信息初始化。

九七的博客 453

【Java 19密封类深度解析】:揭秘记录类在密封继承中的实现限制与最佳实践

掌握Java 19密封类的记录实现限制,深入解析密封继承中的设计约束与优化方案。涵盖适用场景、核心语法及类型安全优势,提升代码可维护性与扩展性。最佳实践指导助力高效开发,值得收藏。

BreakNexus的博客 263

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

密封类允许记录类实现?Java 19这一特性你不可不知(架构设计新范式)

掌握Java 19密封类新特性,提升代码安全性与可维护性。Java 19密封类允许记录类实现,支持在密封层级中使用record,明确限定子类型,适用于领域模型设计等场景,增强编译时检查能力,架构更稳健。值得收藏

CompiShoal的博客 671

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java 19密封记录类全解析,重构你的枚举和工厂模式(性能提升40%实测)

掌握Java 19密封类的记录实现,轻松重构冗长的枚举与工厂模式。适用于领域模型设计、状态机等场景,提升类型安全性与性能实测达40%。代码更简洁,维护更高效,值得收藏。

CodeIsle的博客 573

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java 密封类详解

密封类是Java 15引入、Java 17正式支持的一项语言特性,旨在通过显式限制哪些类可以扩展或实现某个类或接口,实现更安全、可维护的类层次结构。它提供比abstract和final更细粒度的继承控制,提升了模式匹配的穷尽性检查能力,适用于领域建模、安全模型和编译期验证等场景。

持续输出Java相关知识 1514

【JVM专家警告】:Java 19中密封类与记录类结合使用的3个致命误区

掌握Java 19密封类与记录类协同设计精髓,深入解析Java 19密封类的记录实现限制,涵盖适用场景、继承规则与性能优势,规避常见设计误区。提升代码安全性与可维护性,JVM开发者必读指南,值得收藏。

ByteVein的博客 271

【JVM专家警告】:Java 19中误用密封类+记录类将导致编译失败

掌握Java 19密封类与记录类正确结合方式,避免编译错误。本文解析Java 19密封类的记录实现限制,涵盖适用场景、继承规则与设计优势,提升代码安全性与可维护性,值得收藏。

SimTrans的博客 315

揭秘Java 19密封类中的记录实现:为何它将彻底改变你的设计模式?

掌握Java 19密封类的记录实现,提升代码安全与设计清晰度。通过密封类限制继承层级,结合记录类简化不可变数据建模,适用于领域模型、消息传递等场景,增强类型安全性与可维护性,是现代Java开发的重要实践,值得收藏。

DeepLens的博客 659

【Java高级特性避坑指南】:掌握密封类+记录类的兼容性限制

掌握Java 19密封类的记录实现限制,解决复杂类型设计难题。详解密封类与记录类结合的适用场景、核心语法及规避不兼容问题的方法,提升代码安全性与可读性。深入解析JDK 19新特性,值得收藏。

CompiWander的博客 375

Java17新特性深度解析记录类与密封类的实战应用

System.out.println(文件消息: + fm.filename());System.out.println(文本消息: + tm.content());System.out.println(系统命令: + sm.command());- 自动生成 `equals()`、`hashCode()` 和 `toString()` 方法。- 所有字段均为 `private final`,通过访问器方法(如 `name()`)暴露。

NwFadtwZ的博客 522

Java17新特性深度解析记录类、密封类与模式匹配的实战应用

密封类通过`sealed`关键字和`permits`子句,明确指定哪些类可以继承它。这解决了传统继承模型中无法限制子类类型的痛点,使得类型的可能性变为封闭且可知的。这在定义代数数据类型时尤其有用,例如,我们可以定义一个密封类`Shape`,并只允许`Circle`和`Rectangle`继承它:`sealed class Shape permits Circle, Rectangle {}`。这种精确的控制为编译器进行彻底的流程分析奠定了基础。

xiongchaosuper的专栏 745

【Java 22高阶技巧】:5步实现密封类与Records的完美协同建模

掌握Java 22密封类与Records的联合数据建模,5步实现类型安全与不可变数据结构的高效协同。适用于领域建模、代数数据类型等场景,提升代码可读性与维护性,值得收藏。

PixelGlow的博客 939

揭秘Java 22新特性:如何用密封类+Records构建类型安全的领域模型

掌握Java 22密封类与Records的联合数据建模,轻松构建类型安全的领域模型。适用于代数数据类型、业务状态建模等场景,通过封闭继承体系与不可变数据类协同设计,提升代码可读性与维护性。结构清晰、编译时验证,杜绝非法子类型扩展,值得收藏。

IterLoom的博客 601

仅限高级开发者知晓:Java 22密封类+Records实现不可变封闭类型的4步法

掌握Java 22密封类与 Records 的联合数据建模,四步构建不可变封闭类型,提升类型安全与代码可维护性。适用于领域模型设计与API返回值定义,兼顾简洁与严谨,高级开发者必备技巧,值得收藏。

simcode的专栏 690
上一篇: Java向量计算新纪元(Vector API孵化器大揭秘)
下一篇: 深入JVM底层:CopyOnWriteArrayList迭代时如何避免数据不一致(附源码分析)
QuickProceed
博客等级 码龄1年 149粉丝 2008原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值