Effective Java笔记:静态工厂方法代替构造器

java静态工厂方法详细解析——使用静态工厂方法代替构造器 本文目录一、什么是静态工厂方法?二、静态工厂方法的优势三、静态工厂方法的缺点四、总结 一、什么是静态工厂方法? 对于类而言,在我们需要获取一个实例时,最传统的方法都是通过new新建一个对象,这是jvm通过调用构造函数帮我们实例化出来的对象。而静态工厂方法则是另外一种不通过new来获取一个实例的方法,我们可以通过一个类中公有的静态方法,来返回一个实例。 比如有这样一个People类: class People{ String name; int age; int weight; } 我们传统的获取实例都是通过new: People People=new People(); 而静态工厂方 立即下载

静态工厂方法代替构造器是《Effective Java》(第3版) 中非常重要的一条建议,** 避免直接使用构造器,优先考虑静态工厂方法**。这是编写高质量、易维护、灵活代码的一个关键技巧。


静态工厂方法是什么?

静态工厂方法是通过 类的静态方法 来创建实例,而不是直接通过构造器创建对象。

示例说明传统构造器与静态工厂方法的对比:

1. 使用构造器

public class User {
    private final String name;
    private final int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

调用方式 → 标准构造器:

User user = new User("Alice", 30);

2. 使用静态工厂方法

public class User {
    private final String name;
    private final int age;

    // 私有构造器,限制直接创建对象
    private User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 静态工厂方法用于创建实例
    public static User of(String name, int age) {
        return new User(name, age);
    }
}

调用方式 → 静态方法:

User user = User.of("Alice", 30);

与构造器创建看起来相似,但静态工厂方法有很多优点。


静态工厂方法的优势

书中强调:与直接使用构造器相比,静态工厂方法提供了更大的灵活性和可维护性。以下是具体优点:


1. 可以为方法命名,提高代码可读性

  • 构造器只能通过类名进行标识,但静态工厂方法可以取一个有意义的名字,描述返回对象的意图。

比较两种代码:

BigInteger(int bitLength, int certainty, Random rnd);  // 构造器
BigInteger.probablePrime(int bitLength, Random rnd);  // 静态工厂方法

probablePrime 作为名字明确表达了工厂方法的真正意图,因此更加直观。而构造器 BigInteger(int bitLength, ...) 则没有这样的语义信息。


2. 可以控制实例的数量,返回单例或缓存实例

  • 通过静态工厂方法,有机会缓存已经创建的实例,比如返回 单例模式对象 或 复用对象。

单例示例:

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    
    private Singleton() { }  // 私有构造器

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

调用:

Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);  // true,始终返回同一个实例

此外,还可以实现对象池(缓存):

public class User {
    private static final Map<String, User> CACHE = new HashMap<>();

    private final String name;

    private User(String name) {
        this.name = name;
    }

    public static User of(String name) {
        return CACHE.computeIfAbsent(name, User::new);
    }
}

3. 可以返回子类或特定实现对象

  • 静态工厂方法不需要返回该类的对象,可以返回任意子类的实例,这样能有效隐藏实现细节。

示例:

public interface Car {
    void drive();
}

class ElectricCar implements Car {
    @Override
    public void drive() {
        System.out.println("Electric car driving...");
    }
}

class GasCar implements Car {
    @Override
    public void drive() {
        System.out.println("Gas car driving...");
    }
}

class CarFactory {
    public static Car getCar(String type) {
        return switch (type) {
            case "electric" -> new ElectricCar();
            case "gas" -> new GasCar();
            default -> throw new IllegalArgumentException("Unknown car type");
        };
    }
}

调用:

Car car = CarFactory.getCar("electric");
car.drive();  // Electric car driving...

优点:调用者不需要知道具体类型,只关注接口或父类。可以轻松复用接口实现,且隐藏子类,增强了灵活性。


4. 延迟实例化,提高性能

  • 静态工厂方法可以根据需要控制实例化。

例如,Boolean.valueOf() 方法返回了 Boolean.TRUE 或 Boolean.FALSE,确保所有使用者共享同一实例,而不是每次创建新的对象:

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

这种直接复用极大地提高了性能。


5. 灵活定制返回结果类型

  • 静态工厂方法可以根据参数灵活地返回不同的类型实例,这种灵活性是构造器无法实现的。

例如,返回不可变集合:

List<String> list = List.of("A", "B", "C");
Set<Integer> set = Set.of(1, 2, 3);

Java 标准库中的例子:

  • Collections.unmodifiableList(...) 返回的是不可变视图对象,防止对原集合的修改。

6. 适合参数类型复杂的情况

  • 使用静态工厂方法时,我们可以通过不同的方法名称将参数组合简化,不需要多个类似重载的构造器。

传统构造器的缺点:

public class User {
    private String name;
    private int age;
    private boolean isAdmin;

    public User(String name) { ... }
    public User(String name, int age) { ... }
    public User(String name, int age, boolean isAdmin) { ... }
}

重载构造器太多,容易混淆。

替代方案:

public class User {
    private String name;
    private int age;
    private boolean isAdmin;

    private User(String name, int age, boolean isAdmin) {
        this.name = name;
        this.age = age;
        this.isAdmin = isAdmin;
    }

    public static User ofName(String name) {
        return new User(name, 0, false);
    }

    public static User ofNameAndAge(String name, int age) {
        return new User(name, age, false);
    }

    public static User admin(String name, int age) {
        return new User(name, age, true);
    }
}

静态工厂方法的缺点

当然,静态工厂方法也有一些不足之处:

  1. 难以发现:相比构造器,静态工厂方法不能靠 “new” 关键字直观发现,需通过文档了解其用法。

    • 解决方案:为静态工厂方法起一个清晰的名字,让方法意图更明显。
  2. 无法被子类继承:因为静态方法不能被子类重写,可能会影响扩展性。

    • 解决方案:将类设计为 final 或提供更高层次的抽象(接口 + 工厂类)。

在软件开发中,是否将类设计为 final 或通过更高层次的抽象解决扩展问题,往往取决于具体需求和设计情境。这两种方法各有适用场景,下面用一个更具体的例子来讲解这两种方式的使用:


方案 1:将类设计为 final
意图:

通过将类设计为 final,防止子类继承或改写它的行为。这种做法适用于工具类、不可变类或那些不希望被继承和扩展的类。

示例代码:
public final class PaymentService {
    private final String paymentMethod;

    // 私有构造器
    private PaymentService(String paymentMethod) {
        this.paymentMethod = paymentMethod;
    }

    // 静态工厂方法:创建具体支付服务
    public static PaymentService createAliPayService() {
        return new PaymentService("AliPay");
    }

    public static PaymentService createWeChatPayService() {
        return new PaymentService("WeChatPay");
    }

    public void processPayment(double amount) {
        System.out.println("Processing " + paymentMethod + " payment of $" + amount);
    }
}
使用方式:
PaymentService alipay = PaymentService.createAliPayService();
alipay.processPayment(100.00);

PaymentService weChatPay = PaymentService.createWeChatPayService();
weChatPay.processPayment(200.00);
特点:
  1. final 修饰:类不可继承,确保其行为是固定的(如安全性保证、防止修改,特别适合工具类)。
  2. 静态工厂方法:屏蔽了具体构造过程,调用者只能通过方法名选择对象类型(比如返回支付宝或微信支付实例)。
  3. 局限性:
    • 一旦定义了 final,就无法扩展。如果需要追加新的支付方式(例如 PayPal),需要在原类中添加新的静态方法并修改类代码。

方案 2:接口 + 工厂类
意图:

提供一个更高层次的抽象,通过接口定义行为,由工厂类动态决定返回具体的实现。这种设计更灵活,易于维护和扩展。

示例代码:
1. 定义接口:
public interface PaymentService {
    void processPayment(double amount);
}
2. 提供具体实现类:
public class AliPayService implements PaymentService {
    @Override
    public void processPayment(double amount) {
        System.out.println("Processing AliPay payment of $" + amount);
    }
}

public class WeChatPayService implements PaymentService {
    @Override
    public void processPayment(double amount) {
        System.out.println("Processing WeChatPay payment of $" + amount);
    }
}

public class PayPalService implements PaymentService {
    @Override
    public void processPayment(double amount) {
        System.out.println("Processing PayPal payment of $" + amount);
    }
}
3. 创建工厂类:
public class PaymentServiceFactory {
    public static PaymentService getPaymentService(String type) {
        return switch (type.toLowerCase()) {
            case "alipay" -> new AliPayService();
            case "wechatpay" -> new WeChatPayService();
            case "paypal" -> new PayPalService();
            default -> throw new IllegalArgumentException("Unknown payment type: " + type);
        };
    }
}
使用方式:
PaymentService alipay = PaymentServiceFactory.getPaymentService("alipay");
alipay.processPayment(100.00);

PaymentService weChatPay = PaymentServiceFactory.getPaymentService("wechatpay");
weChatPay.processPayment(200.00);

PaymentService paypal = PaymentServiceFactory.getPaymentService("paypal");
paypal.processPayment(300.00);
特点:
  1. 接口抽象:调用方无需关心具体类的实现(AliPayService、WeChatPayService 等),只与接口 PaymentService 交互。这使得代码更具扩展性。

  2. 工厂动态实例化:工厂类 PaymentServiceFactory 通过传入的参数,动态决定返回哪个具体实现。

  3. 易扩展:添加新的支付方式,只需新增实现类和修改工厂逻辑(而不需要修改已有类的代码):

    新增一个支付方式(例如 StripeService):

    public class StripeService implements PaymentService {
        @Override
        public void processPayment(double amount) {
            System.out.println("Processing Stripe payment of $" + amount);
        }
    }
    
    // 修改工厂类:
    public static PaymentService getPaymentService(String type) {
        return switch (type.toLowerCase()) {
            case "alipay" -> new AliPayService();
            case "wechatpay" -> new WeChatPayService();
            case "paypal" -> new PayPalService();
            case "stripe" -> new StripeService();
            default -> throw new IllegalArgumentException("Unknown payment type: " + type);
        };
    }
    

两种方案的对比
特点final 类方案接口 + 工厂类方案
扩展性不可扩展,新增支付方式需要修改原类非常灵活,添加新实现无需修改已有代码
适用场景行为固定,稳定,不希望子类扩展行为多样,依赖多种实现,鼓励接口分层设计
复杂性较低,适合简单场景实现较高,对接更多实现类和分层需求
设计模式静态工厂工厂模式
子类限制不允许子类继承调用方只关心接口,无需了解具体的实现类

总结和应用建议
  1. 使用 final 类:

    • 如果当前类是小型工具类(如 StringUtils、Math),或对外暴露的是一个行为固定、简单且无需扩展的类,使用 final 关键字能防止滥用继承,同时提升安全性。
    • 适合进行稳定行为封装,如单例模式或者不可变对象。
  2. 使用接口 + 工厂类:

    • 若系统需求复杂且容易变化(如支持多种支付方式、插件化架构等),推荐使用接口加工厂类的模式。利用接口定义行为、工厂管理创建过程,实现解耦和扩展性。
    • 遵循 “面向接口编程” 的原则,便于后期维护和扩展。
IMU卡尔曼滤波方法详细介绍 本文介绍了基于IMU和卡尔曼滤波的状态估计方法。系统采用9维状态向量(位置、速度、加速度计零偏),通过牛顿运动学建立状态方程,并利用外部位置观测进行校正。详细推导了状态转移矩阵和控制输入矩阵的形式,阐述了预测和更新的计算步骤。同时说明了过程噪声Q和观测噪声R的设置原则,其中Q反映模型不确定性,R取决于传感器精度。该方法可有效融合IMU测量与外部观测数据,实现位置、速度和偏置的联合估计。 阅读详情

相关推荐

别再只用CANape测数据了!手把手教你用ASAP2 Studio编辑A2L文件(附MAP文件更新避坑指南)

本文深入探讨ASAP2 Studio在ECU开发中的高阶应用,特别是如何利用其编辑A2L文件并同步更新MAP文件,提升测量标定效率。文章详细解析了ASAP2 Studio的双向同步能力、MAP文件更新全流程及变量管理技巧,帮助工程师避免常见错误,优化工作流程。

weixin_26833939的博客 507

Java中级——用静态工厂方法代替构造器

用静态工厂方法代替构造器静态工厂方法和构造器是什么?优点1——具有方法名的静态工厂方法更利于理解优点2——具有方法名的静态工厂方法可打破构造器签名的限制 静态工厂方法和构造器是什么? 构造器即构造函数,用于生成类实例 静态工厂方法不同于设计模式中的工厂方法,而是一个返回类实例的静态方法 优点1——具有方法名的静态工厂方法更利于理解 如一个输入数字,返回其是奇数还是偶数的字符串,利用构造器的设计如下 class A { private String value; A(int num) {

松仔Log的博客 1871

基于反相器的超声波发生和气泡检测电路

本文主要介绍了关于超声波的两种电路——基于反相器的振荡电路和基于逻辑们的气泡检测电路

xehagy的博客 1954

小鸡爪读Effective Java记录1:用静态工厂方法代替构造器

小鸡爪==菜鸡 只因鸡你太美 小鸡爪读Effective Java记录1:用静态工厂方法代替构造器。

weixin_44339617的博客 377

CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法

CELF(Cost-Effective Lazy Forward selection)算法解析      引言:在社交网络影响力最大化问题的求解过程中,我们往往需要去选择一些目标种子结点作为信息初始传播的源头。贪婪算法在传播效果上的解决可以达到影响的最大化,但是在时间复杂度上面显得确十分糟糕。为此CELF算法应势而生,CELF算法利用了函数次模性的特点,在第一轮选择种子结点时,计算网络中所有节点的边际收益,但将在之后的过程中,不再做网络节点边际收益的重复计算,这相对于传统的贪婪算法,将在时间上得到非常明显的

hahaxq的博客 2476

从零构建:四轴机械臂D-H参数建模与MATLAB实战指南

本文详细介绍了四轴机械臂D-H参数建模的完整流程与MATLAB实战应用。从机械臂运动学基础出发,解析D-H参数原理与坐标系建立规则,提供MATLAB Robotics Toolbox的安装、模型创建及正逆运动学求解的代码实现。特别针对四轴机械臂的逆运算优化、轨迹规划和奇异位形规避等高级应用给出实用解决方案,是机器人开发者的实战指南。

weixin_29062255的博客 419

用静态工厂方法代替构造器

参考于《Effective Java》 前言 对于类而言,获得其实例最常见的方式就是提供一个构造器。 如果我们不写构造器,编译器会帮我们自动加上一个被public修饰的空构造器。 除了提供构造器以外,静态工厂方法也应该被考虑到程序的设计当中。 静态工厂方法 本质上就是类的一个静态方法,返回值是类的实例对象。 通过私有化构造器,无法直接new对象,而是通过运行静态工厂方法获取对象实例。 这么做既...

程序员小潘 3454

从ACTF2020看文件上传漏洞:你以为改后缀就完事了?这些坑我都帮你踩过了

本文通过ACTF2020的Upload题目深入剖析文件上传漏洞的复杂性和防御策略。文章揭示了常见误区,如仅修改文件后缀的局限性,并详细解析了绕过技巧和高级防御机制。从开发角度提供了构建安全上传功能的实用建议,帮助读者全面理解文件上传漏洞的本质与防护方法。

weixin_29278805的博客 246

创建和销毁对象——用静态工厂方法代替构造器

静态工厂方法和公有构造器各有优点,但通常静态工厂更加合适,因此切忌第一反应就是提供公有的构造器,而不先考虑静态工厂。

m0_56161274的博客 1369

10|Git Diff 与增量代码识别:本次到底改了哪些代码?

本文介绍 Git Diff 和增量代码识别,帮助你理解精准测试如何先找到本次真正变化的代码。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 159

ABAP 平台注册 OAuth 2.0 Client 的完整实践指南(覆盖 Authorization Code、SAML Bearer 与 PKCE)

本文详述了在ABAP平台上注册入站OAuth 2.0 Client的关键技术和操作要点。文章面向SAP技术人员,系统梳理了前置条件(TLS/SSL、技术用户、授权对象)、配置路径(SOAUTH2事务)、授权类型差异(授权码、SAML Bearer、PKCE)等重要内容。特别强调入站与出站配置的区别,并提供了保密客户端和公有客户端的配置指引。文中所有事务码和参数均参考SAP官方文档,包含多个实用案例和权限配置建议,为ABAP系统作为OAuth 2.0授权服务器的实施提供全面指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 297

Effective Java笔记第一章创建和销毁对象第一节考虑用静态工厂方法代替构造器

Effective Java笔记第一章 引言 1.java语言支持四种类型:接口(interface),类(class),数组(array)和基本类型(primitive)。 2.接口(interface),类(class),数组(array)被称为引用类型,类实例和数组是对象。 3.类的成员由他的域(field),方法(method),成员类(member class)和成员接口(member interface)组成。 4.方法的签名(signature)由它的名称和所有参数类型组成,不包括返回类型。

zh123456_789的博客 293

【教程4>第8章>第44节】本章整体思维导图与学习总结

本教程系列提供FPGA/MATLAB/Simulink学习资源,包含《MATLAB入门100例》、《FPGA入门100例》、《Simulink入门60例》等基础教程,以及《FPGA/MATLAB/Simulink联合开发》进阶教程和《人工智能基础应用研究》专题,适合不同层次的学习者系统掌握相关技术。

FPGA/MATLAB学习教程/源码/项目合作开发 448

effective Java 笔记1 用静态工厂方法代替构造器

用静态工厂方法代替构造器

shrek11的专栏 251

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VB摄像头监控

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

Effective Java笔记(1)用静态工厂方法代替构造器

本条目中所指的静态工厂方法并不直接对应于设计模式( Design Pattern )中的工厂方法。下面是一个来自 Boolean (基本类型 boolean 的装箱类)的简单示例。对于类而言,为了让客户端获取它自身的一个实例,最传统的方法就是提供一个公有的构造器。还有一种方法,类可以提供一个公有的静态 工厂 方法( static factory method ),它只是一个返回类的实例的静态方法。如果不通过公有的构造器,或者说除了公有的构造器之外,类还可以给它的客户端提供静态工厂方法。

琅琊之榜 475

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Effective Java第二版笔记之考虑使用静态工厂方法代替构造器

创建对象最直接的想法就是通过new调用构造器,其实大多数情况下应当通过自己写一个静态公有方法,返回类的实例,比如下面这个方法: public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 和直接使用构造器相比,使用静态工厂方法具有以下优点: 静态工厂方法可以根据用途自己定义名称(不必与类相同),可读性更强 静态工厂方法可能不用在每次调用时都创建新对象 静态工厂方法可以返回声明

谈谈IT 176

Effective Java 学习笔记 使用静态工厂方法代替构造器

什么是使用静态工厂方法代替构造器:创建一个静态方法,返回值是类的实例 使用静态工厂方法的好处总结: 1.可以隐藏构造方法,把控对象的创建。可以让对象是单例,复用已经有的对象,比如Boolean  public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE= new Boole

qq_20575775的博客 428

读《Effective Java》笔记之 第一条:考虑用静态工厂方法代替构造器

静态工厂方法与构造器相比的优势:它们有名称:可以更好地指示出使用这一方法创建出的对象所具有的特征。(尤其是当多个构造器只有参数顺序不同的时候)不必在每次调用的时候,都创建一个新的对象。这使得不可变类可以使用预先构建好的实例,或者作为缓存,重复利用。(例如 Boolean.valueOf(boolean))有助于控制类的实例(实例受控的类 instance-controlled)。可以返回原返回类型...

myco前的专栏 404

《Effective Java》学习笔记 - (1) 使用静态工厂方法代替构造器

对于类而言,为了让客户端获取它本身的一个实例,最传统的方法就是使用构造器,还有一种方法就是可以使用静态工厂方法。这是《Effective Java》这本书的第一节,里面主要介绍一点就是尽量使用静态工厂方法而不是构造器。...

Jwasx的博客 390

读书笔记之《effective java》----静态工厂方法代替构造器

《effectiv java》是一本经典的java类的书籍,它可以教我更加高效的编写代码。 静态工厂方法与构造器不同的第一大优势在于,它们有名称。 ----就像标识一样,可以通过名字,很快的找到它,把软件想象成一个家庭,用它的时候,直接用名字叫“嘿,老三,我要用你的刀和菜板”,用到二胖的时候就叫“嘿,二胖,我要用你的锅和碗”。  一个类只能有一个带有指定签名的构造器 。如果想要另一个构造...

黑呆呆 313

Effective Java 读书笔记之 1.考虑用静态工厂方法代替构造器

对于一个类而言,其它类要想获取该类的实例,该类必须要提供一个公有构造器。 使用静态工厂方法代替构造器的优点:静态工厂方法可以通过方法名称准确描述返回的实例对象在一个类中,可能会重载构造器,提供多个构造器共使用,构造器之间参数列表不同,有时候会难以区分,导致可能调用错误的构造器。使用静态工厂方法,通过方法名称可以准确描述要返回的实例的特征。调用静态工厂方法时不需要每一次都要创建一个新的实例对象静态工

inspiredbh的博客 566

effective java笔记--第一条 用静态工厂方法代替构造器

1. 考虑用静态工厂方法代替构造器 对于类而言,为了让客户端获取它自身的一个实例,最常用的方法就是提供一个公有的构造器。 另外,类可以提供一个公有的静态工厂方法(static factory method),它只是一个返回类的实例的静态方法。 如:Boolean 的简单示例: public static Boolean valueOf(boolean b) { ...

huanhuan8944172的专栏 319

【Effective Java笔记】第1条:考虑用静态工厂方法代替构造器

Effective第一条主要讲的是静态工厂方法的四大优势! 一、什么是静态工厂方法 是一个返回类的实例的静态方法 例: test类 public class test { private static test instance; //静态工厂方法懒汉模式 public static test getInstance() { ...

浅然的专栏 786

Effective Java 读书笔记(一):使用静态工厂方法代替构造器

这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文《java中final与static的使用场景总结》。 什么是静态工厂方法? 可以参考书中的例子(摘自JDK1.7 java.lang.Boolean) public final

winter2summer的博客 390

effective java读书笔记1:考虑用静态工厂方法代替构造器

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33800593的博客 144

Effective Java 读书笔记——1:考虑用静态工厂方法代替构造器

类可以提供一个公有的静态工厂方法(static factory method),是一个用来返回类的实例静态方法。比如,下面可以通过boolean来返回Boolean对象引用的方法: public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 上面是一个非常简单的静态工厂方法,

萌萌小七的专栏 379
上一篇: Netty中NioEventLoop源码解析
下一篇: Effective Java笔记:遇到多个构造器参数时要考虑使用构建器
Jooou
博客等级 码龄9年 226粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值