Effective Java-创建和销毁对象


一、考虑用静态方法代替构造器
  类可以通过静态工厂方法来提供它的客户端,而不是通过构造器。
优势:
  1、它们有名称,可以根据名称将创建对象的行为表达的更清楚。
  2、可以不必在每次调用它们的时候都返回一个新对象。这使得不可变类可以使用预先构建好的实例,或者将构建好的实例缓存起来,进行重复利用。
  3、它们可以返回原返回类型的任何子类型的对象。API可以返回对象,同时又不会使对象的类变成公有的。以这种方式隐藏实现细节。
  4、在创建参数化实例的时候,它们使代码变得简洁。
缺点:
  1、类如果不含公有的或者受保护的构造器,就不能被子类化。
  2、它们与其它的静态方法实际上没有任何区别。

二、遇到多个构造器参数时要考虑使用构建器。
  重叠构造器模式可行,但是当有许多参数的时候,客户端代码会很难编写,并且难以阅读。一长串类型相同的参数会导致一些微妙的错误。如果客户端不小心颠倒了其中两个参数的顺序,编译器也不会报错,但是程序在运行时会出现错误行为。
  这种情况下,另一种替代方法是使用JavaBean模式。通过setter方法设置必要参数。遗憾的是,这种模式自身有着很重要的缺点。因为构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。与此相关的另一点不足在于,这种模式阻止了类做成不可变类的可能。
  幸运的事,还有第三种替代方法,就是Builder模式。不直接生成想要的对象,而是让客户端利用必要的参数调用构造器,生成一个Builder对象,然后在Builder对象上调用类似setter的方法,来设置每个相关的值。最后,客户端利用无参的builder方法生成不可变对象。这种方式对于参数的增加比较灵活,易于阅读,可以对参数增加约束条件。它也有自身的不足,比如在某些十分注重性能的情况下,它的开销可能就成问题了。该模式比重叠构造器更加冗长,因此它只有在很多参数的时候才使用,特别是当大多数参数是可选的时候。

三#、用私有构造器或者枚举类型强化Singleton属性
  

四、通过私有构造器强化不可实例化的能力。
  对于不可实例化的类,将它的构造器变成私有的。比如只包含静态方法和静态域的类。

五、避免创建不必要的对象
  本条目并不意味着“我们应该要尽可能地避免创建对象”。由于小对象的构造器只做很少量的显示工作,创建和回收动作是非常廉价的。反之,通过维护对象池来避免创建对象并不是一个很好的做法,除非池中的对象是重量级的(典型例子就是数据库连接)。

六*、消除过期的对象引用
  

七#、避免使用终结方法
  

你可能感兴趣的:(effective,读书笔记)