吾本轻狂|Java系列-创建和销毁对象

第一条: 用静态方法代替构造器
对于类而言 , 想要获取自身实例 , 通常都是提供一个公有的构造器 。 另一种方式就是类可以提供一种公有的静态工厂方法 , 作为返回类实例的一种静态方法 。 下面一个将Boolean类型的实例 , 将Boolean类型的值转成Boolean对象应用:
【吾本轻狂|Java系列-创建和销毁对象】 public static Boolean valueOf(boolean b){
return b?Boolean.TRUE:Boolean.FALSE;
}
优势:

  • 第一 , 静态方法相对于构造器而言 , 有自定义名称可以描述方法正确返回的对象 。 由于一个类只能带一个指定签名的构造器 , 因此在方法存在多个参数时 , 编程人员很难将该构造方法返回描述清楚给用户 。
  • 第二 , 每次调用时 , 不需要重新创建对象 。 这种有助于类总能严格控制在某个时刻哪些实例应该存在 , 这种类就是实例可受控类 。 它还使不可变值类可以确保不存在两个相等的实例 , 即仅当a==b时 , a.equals(b)才为true , 这就是享元模式的基础 。
  • 第三 , 它们可以返回原返回类型任意子类型的对象 。 这项技术适用于基于接口的框架(interface base framework) , 为静态方法提供自然返回类型 。 例如:java.util.Collections中45个工具实现都是非公有的类 , 每一种实现都对应一个类 , 被返回的类对象都是由接口精确指定 , 因此客户端引用时只需要接口引用而不需要通过实现类引出被返回的对象 。

吾本轻狂|Java系列-创建和销毁对象
  • 第四 , 所返回对象的类可以随着每次调用而发生改变 , 这这取决于静态方法的参数值 。 这两个实现类客户端是不可见的 , 如果RegularEnumSet不能给小的枚举提供性能优势 , 即使后面的版本更新也不会对现有EnumSet实现造成影响 。 同理 , 客户端永远也不需要关心它们从工厂方法里面得到的类 , 它们只需要知道EunmSet的某个子类即可 。

吾本轻狂|Java系列-创建和销毁对象
  • 第五 , 方法返回对象所属的类 , 在编写包含静态工厂方法的类时可以不存在 。 这种灵活的静态工厂方法构成了服务提供者框架 , 例如JDBC API多个服务提供者实现一个服务 , 系统为多个服务提供者的客户端提供多个实现 , 并它他们在多个实现中解耦出来 。 服务提供框架由服务接口(services interface) , 服务注册接口(provide register) , 服务访问接口(service access)组成 , 因此在获取服务实例的时候 , 客户端可以根据服务访问接口选择实现的条件 , 如果没有则可以返回默认实现的一个实例 。 此外 , 服务提供框架第四种组件服务提供者接口(service provider)可用于生成服务实例的工厂对象 , 通过反射进行实例化 。

吾本轻狂|Java系列-创建和销毁对象


    推荐阅读