我们要得到一个对象,马上想到构造方法,其实,静态工厂方法也可以替我们做到。
例如,在jdk1.4里面,Boolean用了一个静态方法来得到一个boolean对象:
public static Boolean valueOf(boolean b)
question:这个方法实际上并不返回一个object?
对
的, sun的jdk 帮助里面讲: If a new Boolean instance is not required, this
method should generally be used in preference to the constrUCtor
Boolean(boolean).
但是,不是说静态工厂方法所有时候都不返回一个object,只是不是所有时候都返回一个object。
使用静态工厂方法和构造方法比较的优缺点:
优点:
1. 静态工厂方法都是有自己的名字,轻易理解.
2.
静态工厂方法并不要求每次都生成一个对象.比如上面提到的Boolean的public static Boolean
valueOf(boolean b)就不会返回一个object.
sun的jdk帮助文档里面也提到,在不需要得到一个对象的情况下,使用valueof方法可以得到性能的提升.
而且这样,可以控制类在生的期间该类的句柄数,这个作用在单态(item 21)和类型安全(item 21)都是有用的.
3. 静态工厂方法可以返回该类的任何子类,这给了程序员更大的选择空间.
比如Collections,用了很多静态工厂方法来得到immuable的set,map之类的.
而且静态工厂方法可以强迫user通过接口来引用被返回的对象,而不是每次都使用构造函数,这是一个好习惯.
静态工厂方法返回的类,在编写含有静态工厂方法这个类的时候,可以并不存在,这就提供了一种灵活的service provider
framework.比如Java的密码系统扩展(JCE),provider为user提供多个api实现,framework提供一种机制来
register这些实现,用户只需直接使用api,而不用考虑自己在使用哪个实现。
下面是这种机制的程序框架:
import java.util.*;
// Provider framework sketch
public abstract class Foo {
// Maps String key to corresponding Class object
private static Map implementations = null;
// Initializes implementations map the first time it´s called
private 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();
}
}
public static void main(String[] args) {
System.out.println(getInstance("NonexistentFoo"));
}
}
class DefaultFoo extends Foo {
}
静态工厂方法的缺点:
1. 仅仅有静态工厂方法而没有public的构造方法的类不能被继续…这也不是没有好处--可能能迫使程序员使用复合来代替继续.
2. 有时候可能会导致与其他的static方法混淆.这个缺点可以通过使用标准的命名方法来区别于其他的static方法.
现在有两种方法已经开始形成标准:
valueof(type k)-返回和k有相同值的句柄.
Getinstance-返回一个复合参数所描述的句柄.但是不一定和参数具有相同的值..这个方法在Provider framework里面是很有用的.
所以,我们不要每次都毫不犹豫的使用构造方法,有时候静态工厂方法可能是更加合适的.但是当你无法取舍的时候,还是使用构造方法吧,因为它是比较普通和标准的.
转载自:www.matrix.org.cn
分享到:
相关推荐
声明的返回类型的任何子类都是允许的。返回对象的类也可以随每次发布而不同。EnumSet 类(详见第 36 条)没有公共构造方法,只有静态工厂。在 OpenJDK
effective java 读书笔记,第二版自己摘要并翻译,以备速查。
《Effective Java》第三版中文版目录 第一章 介绍 1 第二章 创建和销毁对象 4 1 考虑用静态工厂方法替换构造器 4 2 当遇到多个构造器参
Effective Java读书笔记.pdf
effectiveJava的笔记
考虑使用静态工厂方法代替构造方法 优点: 有名字 每次调用的时候,不一定要创建新的对象 可以返回一个类型的子类型 Collections就是这种用法 返回对象的类可以随调用的不同而变化(用输入的参数值决定返回哪个),如...
《Effective_C#中文版:改善C#程序的50种方法》读书笔记
记录了我的effective-Python学习笔记,精简了effective-Python中重要的部分。effective-Python是一本值得多看几遍的书,但是看后面的几遍的时候完全可以直接看自己的学习笔记。此学习笔记侧重与比较实用的部分即前四...
Effective java 3 学习记录
2021年EFFECTIVEJAVA读书笔记.docx
Effective-Java读书笔记,别人分享的
Effective+C#中文版:改善C#程序的50种方法.rar
《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和全局...
Effective C++学习笔记 没有时间看Effictive C++书的人可以看看这个笔记 总结出了重点啊 适合有c++基础的人阅读
Effective Java读书笔记,记载了大部分我觉的有用的东西,前半部分有代码说明,但后半部分的代码,太过琐碎,就没有整理
【Effective Java】阅读笔记markdown 文件
effective c++读书笔记和总结 effective c++读书笔记和总结
自己整理的侯捷版本<<Effective C++ 改善程序与设计的55个具体做法>> 学习笔记.
考虑静态工厂方法而不是构造函数 传统与灵活的对象实例化方式 静态工厂方法示例: public static Boolean valueOf( boolean b) { return b ? Boolean . TRUE : Boolean . FALSE ; } 的优点和缺点: (PRO) 静态工厂有...