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

来源:互联网 发布:kindle 编程书籍 编辑:程序博客网 时间:2024/05/07 19:12

一、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文档中可能存在茫茫多的静态方法的描述,这样,我们可能找不到如何初始化该类对象的方法。这样就和其他的静态方法之间不具备区别性。

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

0 0