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

本文讨论了静态工厂方法作为创建对象的替代方式,其优点包括命名友好、减少对象创建、灵活返回类型和动态类选择,但缺点是限制了子类化和可能隐藏在方法名中不易察觉。建议根据具体需求权衡两者使用。
摘要由CSDN通过智能技术生成

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

声明:此静态工厂方法非设计模式中的工厂方法模式
对于类而言,创建类的实例对象最常用的手段就是给类提供一个公有的构造器;还有一种手段是提供一个公有的静态工厂方法,它只是一个返回类
的实例的静态方法。
如,我们熟知的Boolean的代码示例

public class BooleanTest {

    private Boolean bool;
    
    // 公有构造方法
    public BooleanTest(boolean bool) {
        this.bool = bool;
    }
    
    // 静态工厂方法
    public static Boolean valueOf(boolean bool){
        return bool?Boolean.TRUE:Boolean.FALSE;
    }

}

对比分析公有构造方法和静态工厂方法创建对象的优劣势

静态工厂方法优势:

  1. 静态工厂方法与构造器不同的第一大优势在于,静态工厂方法有名称,这样有益于客户端使用,产生的客户端的代码更易读。
  2. 静态工厂方法与构造器不同的第二大优势在于,静态工厂方法不必在每次调用它们的时候都创建一个对象。
  3. 静态工厂方法与构造器不同的第三大优势在于,静态工厂方法可以返回原返回类型的任何子类型的对象。
  4. 静态工厂方法与构造器不同的第四大优势在于,静态工厂方法所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值。
  5. 静态工厂方法与构造器不同的第五大优势在于,方法返回的对象的所属的类,在编写包含该静态工厂方法的类时可以不存在。

静态工厂方法劣势:

  1. 静态工厂方法与构造器不同的第五大劣势在于,类如果不含公有的或者受保护的构造器,就不能被子类化。
public class Parent {

    private Parent(){}

    public static Parent getP() {
        return new Parent();
    }
}

// There is no default constructor available in 'effective00.Parent'
public class Son extends Parent {
    
}
  1. 静态工厂方法与构造器不同的第五大劣势在于,程序员很难发现它们。
    可使用from,of,valueOf,instance,getIntance,create,newInstance等方法名来命名。

总结

简而言之,静态工厂方法和公有构造器都有用处,我们需要理解它们各自的长处。静态工厂经常更加合适,因此切忌第一反应就是提供公有的构造器,
而不先考虑静态工厂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值