【Effective_Java】1.用静态工厂方法替代构造器

一、静态工厂方法

类可以提供一个公有的静态工厂方法,它只是一个返回类的实例的静态方法。

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

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

new做了什么?

当我们用new创建一个对象时,JVM就会在内存中开辟一片空间,然后调用构造函数初始化变量,最终把引用返回。

通过new创建出来的对象无法控制对象的行为,当我们对一个类不熟悉时要慎用。通过静态工厂方法能够增大类的提供者对自己所提供的类的控制力。

二、优势

1.有名称

静态工厂方法能确切的描述被返回的对象,可读性更好。当一个类需要多个构造器时,能突出他们的区别。

 BigDecimal decimal = BigDecimal.valueOf(1);
    
 Calendar calendar = Calendar.getInstance();

2.不必在每次调用它们的时候都创建一个新的对象

可以预先构建出一个实例缓存起来,不用每次都new,避免创建不必要的重复对象。实际应用中,单例方法大都用静态工厂方法实现。

//饿汉
public class Single {

    private static final Single INSTANCE = new Single();

    private Single() {
    }

    public static Single getInstance() {
        return INSTANCE;
    }

}

3.他们可以返回原返回类型的任何子类型的对象(里氏替换)

API可以返回对象,又不会使对象的类变成公有的。
Java8之后,接口可以包含静态方法,公有的静态成员应该被放到接口中。
Java9中允许接口有私有的静态方法,但是静态域和静态成员类仍然需要是公有的。

static class Person{
    public static Person getInstance(){
        return new Men();      
    } 
}

static class Men extends Person{
}

4.所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值

public class Student {

    private String name;

    private Integer age;

    public static Student newInstance(String _name,Integer _age){
        Student student = new Student();
        student.name = _name;
        student.age = _age;
        return student;
    }

    public static Student newInstanceWithName(String _name){
        Student student = new Student();
        student.name = _name;
        return student;
    }
    
    public static Student newInstanceWithAge(Integer _age){
        Student student = new Student();
        student.age = _age;
        return student;
    }
    
}

5.方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在


缺点

1 类如果不含公有的或者受保护的构造器,就不能被子类化

2 程序员很难发现它们


静态工厂方法常用名称

  • from 类型转换方法
  • of 聚合方法
  • valueOf from和of的替代
  • instance或getInstance 返回实例
  • create或newInstance 每次调用都返回一个新的实例
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值