[Effective Java]第一话:使用静态工厂方法代替构造方法

本文探讨了在Java中使用静态工厂方法替代构造方法的优点与缺点。静态工厂方法具有易于理解、减少实例化开销、支持类型推断等优势,但同时也存在一些限制,如难以区分于其他静态方法。综合考虑,静态工厂方法在许多情况下是更优选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Item 1:Consider static factory methods instead of constructors(使用静态工厂方法代替构造方法)

优点:

其一、不同于构造方法,静态工厂方法拥有自己的名字。

1、方便别人能够阅读理解;
2、如果书写者在进行类的书写的时候进行了构造方法的重载,那么文档会较难阅读。并且我们建议一个类的构造方法只需要一个就行了。
3、如果一个类的构造方法具备很多个重载方法,那么建议使用静态工厂方法代替这些构造方法,并且谨慎的选择这些静态方法的名称来做标识。

其二、不同于构造方法,静态方法不需要在每次调用类的对象的使用重新进行实例化。(这将允许我们使用那些预先构造好的实例进行调用,或者在类实例化成功之后进行缓存,从而避免重复的实例化。)

1、如果某个类需要进行经常性的取得其实例,那么这样做就能优化性能。(尤其在实例化的时候需要消耗较多的资源。)
2、进行instance-controlled,以便能够保证这个类是单例化(singleton)实现的,并且保证该类的实例不会存在第二个一模一样的。
3、如果使用了singleton模式进行设计,那么该类的摸个一模一样的实例不会存在第二个,这样,我们就可以使用“==”操作符来代替“equals”方法,因为“==”的执行效率较之“equals”高,这样或许能够提高性能。(Enum就提供了这种保证)

其三、不同于构造方法,静态工厂方法能够返回其任意子类的实例,这样能够使你灵活的选择需要实例的类。
其四、减少了对参数类型的声明。

在构造方法中,你需要显示的指明你构造方法的参数中的数据类型,并且这需要你在“=”两遍显示的指明参数的类型。Map<String, List<String>> m =
new HashMap<String, List<String>>();
但是如果使用静态的方法则不然,java会根据类型推断(type inference),编译器会指明参数的类型。或许在以后1.6之后构造方法也能进行类型推断,但是现在看来不会。

缺点:

其一:最大的缺点在于如果该类没有被“public”或者“protected”修饰符进行修饰的话,该类将不能被子类化。 但是塞翁失马,Java中更为提倡的是组合(composition)而非继承(inheritance)。

所谓组合就是在某个类中拥有另外一个类的实例对象,通过调用这个类的实例对象,从而在该类中达到操纵其他类中方法的功能(类似于在某个类中暴露出其接口方法)。

其二:使用静态工厂方法或许较难和其他的静态方法进行区分,因为在API文档中可能存在茫茫多的静态方法的描述,这样,我们可能找不到如何初始化该类对象的方法。这样就和其他的静态方法之间不具备区别性。

小结,静态工厂方法和共有的构造方法各有各的优缺点,我们需要注意并了解他们的价值所在。通常,静态工厂方法是更优的,所以,下次在书写类的时候,不要条件反射式的就写上共有的构造方法哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值