Effective Java 之-----静态工厂与构造器
一、 考虑用静态工厂方法代替构造器:
1)静态工厂方法与构造器不同的第一大优势在于:他们有名称。当一个类需要多个带有相同签名的构造器时,就用静态方法代替构造器,并慎重的选择名称以突出他们间的区别;
2)静态工厂方法第二大优势: 不必在每次调用他们的时候都创建一个新对象;
3)静态工厂方法第三大优势: 他们可以返回原返回类型的任何子类型的对象;
4)静态工厂方法第四大优势: 在创建参数化类型实例的时候,他们使代码变得更整洁;
5)静态工厂方法缺点一:类如果不含公共的或者受保护的构造器,就不能被子类化;
6)静态工厂方法缺点二:他们与其他的静态方法没有任何区别;
二、 遇到多个构造器参数时要考虑用构建器:
1)第一种方式----重叠构造器:第一个构造器只有必要参数,第二个有一个可选参数,第三个有两个可选参数......最后一个包含所有可选参数。要创建实例的时候,就利用参数列表最短的构造器,但该列表中包含了要设置的所有参数(缺点在于当有许多参数时,客户端代码会很难写,并且仍然难以阅读)
2)第二种方法----JavaBeans模式:调用一个无参构造器来创建对象,然后调用setter方法来设置每个必要的参数,以及每个相关的必选参数。
(由于构造过程被分到了几个调用中,在构造过程中JavaBean可能存在不一致的状态,线程安全存在隐患)
3)Builder模式:不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或静态工厂),得到一个builder对象,然后客户端在builder对象上调用类似setter的方法来设置每个相关的可选参数,最后客户端调用午餐的build方法类生成不可变的对象。newInstance方法总是企图调用类的无参构造器,还会传播由无参构造器抛出的任何异常。
三、用私有构造器或者枚举类型强化Singleton属性:
Singleton指仅仅被实例化一次的类,通常用来代表那些本质上唯一的系统组件,实现Singleton有三种方法:
(1)公有静态成员是个final域,享有特权的用户可以调用AccessibleObject.setAccessible方法,通过反射机制调用私有构造器:
public class User{
public static final User INSTANCE = new User();
private User{
}
public void doSomeThing(){...}
}
(2)公有静态成员是个静态工厂方法:
public class User{
public static final User INSTANCE = new User();
private User{
}
public static User getInstance(){ return INSTANCE;}
public void doSomeThing(){...}
}
(3)单个元素的枚举类型:
public enum User{
INSTANCE;
public void doSomeThing(){...}
}
最新文章
- Lua 学习笔记(六)迭代器
- [转]div与span区别及用法
- python进阶学习三——第四天
- Python入门笔记(8):列表
- 学习笔记之 初试Caffe,Matlab接口提取feature
- 机器人学 —— 飞行机器人(Introduction)
- 在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world
- java运算符的优先级和详解
- UIWebView的使用,简单浏览器的实现
- javascript基础DOM操作
- Forget asp.net membership,ASP.NET Identity Overview
- Swift 函数和类
- C++设计模式-Iterator迭代器模式
- Oracle 11g DG手工switchover切换标准化流程
- Linux下一次删除百万文件
- Python打印:九九乘法表
- IntelliJ IDEA 配置 smartGit
- ORA-01578和ORA-26040--NOLOGGING操作引起的坏块-错误解释和解决方案(文档ID 1623284.1)
- android listView多层嵌套listView显示不全问题
- mavean导入本地仓库
热门文章
- Timus Online Judge:ural:1006. Square Frames
- Codeforces 626A Robot Sequence(模拟)
- Java 大数类BigInteger和BigDecimal的基本函数
- Sublime Text 3.0版本的傻瓜式汉化步骤
- in运算符(javascript)
- Ajax beforeSend和complete 方法
- Java数据库基础(JDBC)
- 滑稽的下午--angularjs 2.0管道的使用
- ublime Text 3安装与使用
- 微信小程序+和风天气完成天气预报