首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Effective Java 学习札记第1条 - 考虑用静态工厂方法代替构造函数

2012-10-31 
Effective Java 学习笔记第1条 --- 考虑用静态工厂方法代替构造函数静态工厂方法好处:构造函数有命名的限

Effective Java 学习笔记第1条 --- 考虑用静态工厂方法代替构造函数

静态工厂方法好处:

    构造函数有命名的限制,而静态方法有自己的名字,更加易于理解。静态工厂方法在每次调用的时候不要求创建一个新的对象。这种做法对于一个要频繁创建相同对象的程序来说,可以极大的提高性能。它使得一个类可以保证是一个singleton;他使非可变类可以保证“不会有两个相等的实例存在”。静态工厂方法在选择返回类型时有更大的灵活性。使用静态工厂方法,可以通过调用方法时使用不同的参数创建不同类的实例,还可以创建非公有类的对象,这就封装了类的实现细节。

静态工厂方法坏处:

    如果一个类是通过静态工厂方法来取得实例的,并且该类的构造函数都不是公有的或者保护的,那该类就不可能有子类(被继承),子类的构造函数需要首先调用父类的构造函数,因为父类的构造函数是private的,所以即使我们假设继承成功的话,那么子类也根本没有权限去调用父类的私有构造函数,所以是无法被继承的。毕竟通过构造函数创建实例还是SUN公司所提倡的,静态工厂方法跟其他的静态方法区别不大,这样创建的实例谁又知道这个静态方法是创建实例呢?弥补的办法就是:静态工厂方法名字使用valueOf或者getInstance.

总结:

???? 静态工厂方法和公有的构造函数都有他们各自的用途,我们要理解他们各自的长处,避免一上来就用构造函数,通常静态工厂更加合适。如果没有其他因素强烈的影响我们的选择,最好还是简单的选择构造函数,毕竟他是语言提供的规范。

// Provider framework sketchpublic abstract class Foo {// Maps String key to corresponding Class objectprivate static Map implementations = null;// Initializes implementations map the first time it's calledprivate static synchronized void initMapIfNecessary() {if (implementations == null) {implementations = new HashMap();// Load implementation class names and keys from// Properties file, translate names into Class// objects using Class.forName and store mappings....}}public static Foo getInstance(String key) {initMapIfNecessary();Class c = (Class) implementations.get(key);if (c == null)return new DefaultFoo();try {return (Foo) c.newInstance();} catch (Exception e) {return new DefaultFoo();}}}

热点排行