[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 =
但是如果使用静态的方法则不然,java会根据类型推断(type inference),编译器会指明参数的类型。或许在以后1.6之后构造方法也能进行类型推断,但是现在看来不会。
new HashMap<String, List<String>>();
缺点:
其一:最大的缺点在于如果该类没有被“public”或者“protected”修饰符进行修饰的话,该类将不能被子类化。 但是塞翁失马,Java中更为提倡的是组合(composition)而非继承(inheritance)。
所谓组合就是在某个类中拥有另外一个类的实例对象,通过调用这个类的实例对象,从而在该类中达到操纵其他类中方法的功能(类似于在某个类中暴露出其接口方法)。
其二:使用静态工厂方法或许较难和其他的静态方法进行区分,因为在API文档中可能存在茫茫多的静态方法的描述,这样,我们可能找不到如何初始化该类对象的方法。这样就和其他的静态方法之间不具备区别性。
小结,静态工厂方法和共有的构造方法各有各的优缺点,我们需要注意并了解他们的价值所在。通常,静态工厂方法是更优的,所以,下次在书写类的时候,不要条件反射式的就写上共有的构造方法哦!
- [Effective Java]第一话:使用静态工厂方法代替构造方法
- Effective java读书札记第一条之 考虑用静态工厂方法代替构造器
- Effective Java 第一条:考虑用静态工厂方法代替构造器
- Effective java第一条:考虑用静态工厂方法代替构造器
- 《Effective Java》: 考虑用静态工厂方法代替构造函数
- [Effective Java]考虑用静态工厂方法代替构造器
- 《Effective Java》-考虑用静态工厂方法代替构造器
- Effective Java -- 用静态工厂方法来代替构造器
- effective java--关于静态工厂方法代替构造器
- Effective Java 1:考虑使用静态工厂方法代替构造器
- Effective Java 读书笔记(一):使用静态工厂方法代替构造器
- Effective Java 读书笔记(一):使用静态工厂方法代替构造器
- Effective Java 学习笔记 使用静态工厂方法代替构造器
- effective java 之使用静态工厂方法替代构造方法
- Effective Java (1) - 考虑用静态工厂方法代替构造器
- [Effective Java] 第1条 考虑用静态工厂方法代替构造函数
- Effective Java(1)考虑静态工厂方法代替构造器
- Effective Java记录1:考虑用静态工厂方法代替构造器
- 腾讯WEB前端开发三轮面试经历及面试题
- 黑马程序员----------Java基础------------Collections和Arrays
- Naive Bayes Exercise
- 错误纪录2-“'NSUnknownKeyException', reason: … This class is not key value coding-compliant for the key X
- ICPC 6924 Load Balancing
- [Effective Java]第一话:使用静态工厂方法代替构造方法
- chroot
- 嵌入式Linux的内核镜像生成过程
- Java生成缩略图工具类
- socke通信之三:阻塞版本的客户/服务器模型
- myeclipse 2013 出现符号不匹配的问题 invalid MemberExpression
- python关闭stdout输出缓冲
- mysql使用-创建数据库及表格
- java.lang.IllegalArgumentException: name MUST NOT NULL! at org.nutz.dao.impl.NutDao.fetch