首页 > 编程语言 >Java高效编程(1):使用静态工厂方法替代构造函数

Java高效编程(1):使用静态工厂方法替代构造函数

时间:2024-09-26 12:49:07浏览次数:8  
标签:Java 静态 编程 工厂 Fruit 方法 public 构造函数

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界

在Java编程中,传统上,类允许客户端获取实例的方式是提供一个公共构造函数。然而,还有一种重要的技术,应该成为每个程序员工具箱中的一部分,那就是使用公共的静态工厂方法。静态工厂方法是一个静态方法,返回类的实例。这种方法为我们提供了比构造函数更灵活和可读的创建对象的方式。下面是一个来自 Boolean(布尔值的包装类)的简单示例,展示了如何将布尔基本类型值转换为 Boolean 对象引用:

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

需要强调的是,静态工厂方法与设计模式中的工厂方法模式并不相同。这里描述的静态工厂方法在设计模式中没有直接的等价物。

优点

使用静态工厂方法而非公共构造函数具有多个优点:

  1. 命名的灵活性:静态工厂方法可以有名字,这使得其使用更加直观。例如,BigInteger.probablePrime(int certainty) 方法能够清晰表达其功能,而不仅仅是通过构造函数参数的顺序来说明。

  2. 返回类型的灵活性:静态工厂方法可以返回其子类的实例。这意味着你可以根据需要返回不同的对象类型。例如,假设你有一个 Shape 类,静态工厂方法可以根据参数返回 CircleSquare 对象。

    public static Shape createShape(String type) {
        if ("circle".equalsIgnoreCase(type)) {
            return new Circle();
        } else if ("square".equalsIgnoreCase(type)) {
            return new Square();
        }
        throw new IllegalArgumentException("Unknown shape type");
    }
    
  3. 避免构造函数的限制:一个类只能有一个给定签名的构造函数。程序员往往会通过提供两个参数列表仅在参数类型顺序上有所不同的构造函数来绕过这一限制。这是个非常糟糕的主意。使用这种 API 的用户将无法记住哪个构造函数是哪个,最终会错误地调用了错误的构造函数。相反,使用静态工厂方法可以灵活地创建不同类型的对象而不需要这些困扰。

  4. 实现缓存:静态工厂方法可以返回相同的实例,而不是每次都创建一个新对象。例如,布尔值 Boolean.valueOf(true) 会返回 Boolean.TRUE,而不是每次都创建一个新的 Boolean 对象。这种行为在性能优化中非常有用,尤其是在对象创建成本较高的情况下。

缺点

然而,使用静态工厂方法也有一些缺点:

  1. 不易于识别:由于静态工厂方法不是构造函数,因此它们不如构造函数直观。当看到构造函数时,我们可以直接推测它创建的对象类型,但静态工厂方法的名称需要额外的理解和记忆。

  2. 不支持子类化:如果你想通过构造函数来创建一个子类的实例,使用静态工厂方法可能会限制这种能力。静态工厂方法的返回类型是确定的,这可能会影响继承结构的设计。

  3. 与常规用法不一致:在某些情况下,其他程序员可能更习惯于使用构造函数。使用静态工厂方法可能会让人感到不一致,尤其是在大型项目中。

代码示例

为了更好地理解静态工厂方法的优缺点,下面是一个更复杂的示例:

public class Fruit {
    private String name;

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

    public static Fruit createApple() {
        return new Fruit("Apple");
    }

    public static Fruit createBanana() {
        return new Fruit("Banana");
    }

    @Override
    public String toString() {
        return name;
    }
}

// 使用静态工厂方法
public class Main {
    public static void main(String[] args) {
        Fruit apple = Fruit.createApple();
        Fruit banana = Fruit.createBanana();

        System.out.println(apple); // 输出:Apple
        System.out.println(banana); // 输出:Banana
    }
}

在这个示例中,我们通过静态工厂方法 createApplecreateBanana 创建了 Fruit 对象。这样做不仅提高了代码的可读性,还让创建对象的意图更加明确。

结论

总的来说,静态工厂方法是一种强大的工具,能够帮助我们更清晰、灵活地创建对象。尽管存在一些缺点,但其优势在许多情况下都使其成为一个值得考虑的选择。选择静态工厂方法还是构造函数,最终取决于具体的上下文和需求。

标签:Java,静态,编程,工厂,Fruit,方法,public,构造函数
From: https://blog.csdn.net/nokiaguy/article/details/142553079

相关文章

  • Java高效编程(2):面对多个构造参数时考虑使用构建器模式
    解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界在Java编程中,静态工厂和构造函数都存在一个局限性:当可选参数数量较多时,它们的扩展性较差。以表示食品包装上营养成分标签的类为例,这些标签包含几个必需字段——如份量大小、每容器的份数和每份的卡路里——以及超......
  • Java线程池详解
    目录前言线程池概述线程池的实现线程池的构造拒绝策略任务队列线程池的工作原理线程池的监控Executors线程池工厂自定义线程池使用线程池的好处应用场景总结本文详细探讨了线程池在并发编程领域的应用,介绍了ThreadPoolExecutor的核心组件、工作原理,线程池的构造......
  • 基于Java+SpringBoot+Mysql陪练系统功能设计与实现一
    一、前言介绍:1.1项目摘要随着互联网技术的飞速发展和普及,网络游戏已成为人们休闲娱乐的重要方式之一。随着游戏玩家群体的不断扩大,游戏内竞争日益激烈,许多玩家为了提升游戏技能、快速升级或享受游戏乐趣,开始寻求外部帮助,如寻找高水平玩家进行陪玩或雇佣代练服务。这一需......
  • 基于Java+SpringBoot+Mysql陪练系统功能设计与实现二
    一、前言介绍:1.1项目摘要随着互联网技术的飞速发展和普及,网络游戏已成为人们休闲娱乐的重要方式之一。随着游戏玩家群体的不断扩大,游戏内竞争日益激烈,许多玩家为了提升游戏技能、快速升级或享受游戏乐趣,开始寻求外部帮助,如寻找高水平玩家进行陪玩或雇佣代练服务。这一需......
  • JavaScript简介及示例
                                                JavaScript简介及使用 一、简介JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为Ja......
  • PTA JAVA语言 6-1 数字翻转
    6-1数字翻转分数10全屏浏览切换布局作者 Ma单位 山东科技大学现需要编写一个方法publicstaticintrNum(intnum)用于对用户输入的三位数进行翻转。裁判测试程序样例:importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){......
  • 三大硬核方式揭秘:Java如何与底层硬件和工业设备轻松通信!
    大家好,我是V哥,程序员聊天真是三句不到离不开技术啊,这不前两天跟一个哥们吃饭,他是我好多年前的学员了,一直保持着联系,现在都李总了,在做工业互联网相关的项目,真是只要Java学得好,能干一辈子,卷死的是那些半吊子。感谢李总给我分享了工业互联网项目的事情,收获很多,今天的内容来聊一......
  • Java计算正方形
    publicclassSquareArea{//声明一个常量,用于表示正方形的边长publicstaticfinaldoubleSIDE_LENGTH=5.0;publicstaticvoidmain(String[]args){//声明一个局部变量来存储计算得到的面积doublearea;//调用calculateArea方法,并将结果赋值给局部......
  • 第十五届蓝桥杯javaA组 砍柴 (两种写法)详解
    参考资料原题链接砍柴-蓝桥云课(lanqiao.cn)区间质数搜索——埃拉托斯特尼筛法和欧拉筛法-CSDN博客思路质数筛+二分+博弈+状态机(只因bushi)$$状态转移方程 dp[i] = !dp[i-p]$$由原始题意可以看出砍树长度限制为小于其长度的质数——暗示你使用质数筛交替砍......
  • java程序
    importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;classStudent{privateintid;privateStringname;privateintage;publicStudent(intid,Stringname,intage){this.id=id;this.name=name;this.age=age;}......