然而并没有什么东西┑( ̄Д  ̄)┍

0%

[Java]Effective Java 笔记-创建和销毁对象

创建与销毁对象

考虑用静态工厂方法代替构造器

对于类而言,让客户端获取实例,一般有两种方式:

  • 提供一个公有构造器;

  • 静态工厂方法;

    静态工厂方法只是一个返回类的实例的静态方法:

    demo:

    1
    2
    3
    public static Boolean valueOf(boolean b){  
    return b?Boolean.TRUE:Boolean.False;
    }

需要注意的是,静态工厂方法与设计模式中的工厂方法并不相同

类可以通过静态工厂方法来提供他的客户端,而不是通过构造器,优势有:

  1. 与构造器相比,静态工厂方法有名称;
    如果构造器的参数本身没有确切地描述正被返回的对象,那么具有适当名称的静态工厂方法会更容易使用,代码也更易阅读。
    一个类只能有一个带有指定签名的构造器,只能通过参数不同来进行区别,但是用户调用api时就会懵逼,但是静态工厂方法就不会有这种问题。
  2. 不必在每次调用静态工厂方法的时候都创建一个新对象;
    这样就使不可变类可以使用预先构建好的实例,或者将实例缓存,反复使用,避免不必要的反复创建。
    能用==来代替equals(obj)提升性能。
  3. 静态工厂方法可以返回原类型的任何子类型的对象;
    选择返回对象时有更大的灵活性。
    API可以选择返回的对象,同时又不会是对象的类变为共有的。

共有的静态工厂方法所返回的对象的类不仅可以是非公有的,而且该类还可以随着每次调用而发生变化,着取决于静态工厂方法的参数值。

在jdk1.5中,java.util.EnumSet没有公共构造器,只有静态工厂方法,他们返回两种实现类之一,取决于底层枚举类型的大小:

  • 元素个数小于等于64个,则返回RegularEnumSet,用单个long进行支持;
  • 大于64个,则使用JumboEnumSet,用long数组进行支持.

静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的时候可以不必存在.这便是服务提供者框架(Service Provider Framework)的基础:

多个服务提供者实现一个服务;
系统为服务提供者的客户端提供多个实现,并把他们从实现中解耦出来.

服务提供者框架中有三个重要组件:

  1. 接口服务(Service Interface)
    由提供者实现
  2. 提供者注册API(Provider Registration API)
    这是提供者用来注册实现的,让客户端访问他们
  3. 服务访问API(Service Access API)
    这是客户端用来获取服务的实例的.
    服务访问API一般允许但是不要求客户端指定某种选择提供者的条件

遇到多个构造器参数时要考虑用构造器

  • 直接用构造函数,遇到大量参数会使得构造函数的参数列表十分臃肿;
  • 用JavaBean的Getter和Setter在多线程时容易使类处于不一致状态;
  • 使用Builder模式

就是用内部类Builder作为构造器参数,同时自己也可以暂存构造参数

用私有构造器或者枚举类来强化Singleton属性

singeton指仅仅被实例化一次的类,被用来代表本质上唯一的系统组件。

通过私有构造器强化不可实例化的能力

企图通过将类做成抽象类来强制该类不可被实例化是行不通的。

由于只有当类不包含显示构造器的时候编译器才会生成缺省的构造器,因此我们只要让这个类包含私有构造器,他就不能被实例化了

避免创建不必要的对象

谨慎使用自动装箱,优先使用基本类型

消除过期的对象引用

就是叫你手动置空

避免使用终结方法

鬼知道finalizer多久会运行
要终结就显示地try-finally

Reference

  • 《Effective Java》