Effectivejava Note
一、创建和销毁对象
本节主要回答一下几个问题:
- 何时以及如何创建对象?
- 何时以及如何避免创建对象?
- 如何确保它们能够实时地销毁?
- 如何管理对象销毁之前必须进行的各种清理操作?
- 考虑使用静态工厂方法代替构造器
- 静态工厂方法与构造器不同的第一大优势在于,它具有名称如果构造器的参数本身没有确切地描述正被返回的对象,那么具有适当名称的静态工厂会更容易使用,产生的客户端代码也更易于阅读。例如,构造器BigInteger(int, int, Random)返回的BigInteger可能为素数,如果用名为BigInteger.probablePrime的静态工厂方法来表示,显然更为清楚。
- 静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象 静态工厂方法能够为重复的调用返回相同的对象,这样有助于类总能严格控制在某个时刻哪些实例应该存在。(实例受控制的类,instance-controlled)。
- 静态工厂方法与构造器不同的第三大优势在于,它们可以返回类型的任何子类型的对象
- 静态工厂方法的第四大优势在于,在创建参数化类型实例的时候,它们使代码变得更加简洁
- 服务提供者框架是指这样一个系统:多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把它们从多个实现中解耦出来。
- 服务提供者框架(Service Provider Framework)包括三个重要的组件:
- 服务接口(Service Interface),这就是提供者实现的;
- 提供者注册API(Provider Registration API), 这是系统用来注册实现,让客户端访问它们的;
- 服务访问API(Service Access API),是客户端用来获取服务的实例的。服务访问API一般允许但是不要求客户端指定某种选择提供者的条件。如果没有这样的规定,API就会返回默认实现的一个实例。服务访问API是”灵活的静态工厂“, 它构成了服务提供者框架的基础。
- 服务提供者接口(Service Provider Interface),这个框架是可选的,这些提供者负责创建其服务实现的实例。
- 对于JDBC来说,Connection就是它的服务接口,DriverManager.registerDriver是提供者注册API,DriverManager.getConnection是服务访问API,Driver就是服务提供者接口。
-
- 静态工厂方法的主要缺点在于,类如果不含有公有化的或受保护的构造器,就不能被子类化。
- 静态工厂方法的第二个缺点在于,它们与其他的静态方法实际上没有任何区别。