effective java之创建和销毁对象

创建和销毁对象

  1. 何时以及如何创建对象
  2. 何时以及如何避免创建对象
  3. 如何适时销毁对象
  4. 如何管理对象销毁之前进行的各种清理动作

静态工厂方法创建对象

创建对象实例
  1. 一般情况下使用的构造器
  2. 静态工厂方法用来创建一个类的实例对象
与构造器对比
  1. 工厂方法对创建对象有明确说明。

    不同的工厂方法有不同的适当方法名称,后期维护更加易读、可维护。而构造方法对返回的对象没有明确的细化说明。

    构造方法中存在多个参数,会增加后期维护的成本,没有文档说明或者注释,维护更加困难,因为不知道使用哪个构造方法。工厂方法替代构造方法多个参数情况,可以使用合理有意义的方法名加以区分。

  2. 不必在每次调用他们时,创建一个新的对象。

    使用预先已经创建好的对象,比如单例场景,
    或者将创建对象缓存,后续调用相同方法时,使用缓存中的对象实例,比如放到map中使用

  3. 创建参数化类型实例,静态方法使代码书写更加简洁

Map<String, List<String>> map = new HashMap<>(String, List<String>);
//使用静态工厂方法后
public static <K, V> HashMap<K, V> newInstance(){
    return new HashMap<K, V>();
}
//创建一个map对象
Map<String, List<String>> map = HashMap.newInstance();
静态方法局限性
  1. 如果没有public或者protected构造,无法实例化对象
  2. 与其他的静态方法实际上没有任何区别。值得注意的是,jdk中有类似,getInstance,newInstance,newType,newXxx等
  3. 优先考虑静态工厂,而非构造方法

多个参数考虑使用build构建器

静态工厂与构造方法局限性

拓展有大量参数(4个参数以上)情况,如果使用构造方法,需要创建很多构造方法,开发维护麻烦,大量构造方法阅读起来相当费劲,因此可以采用build构造器

优点
  1. Build模式可以拓展多个参数或者对象
  2. Build模式配置参数是灵活的、可选的
  3. Build模式可以在构造各个参数时进行调整
  4. Build模式可以在构造期间,进行参数或者对象有效性检测
缺点
  1. 创建某个对象时,需要先创建构建器,再去创建对象
  2. 待创建对象参数很多时,builder会变的很冗长
场景

有大量参数(4个参数以上)情况,并且参数是可选的,可自身定制的,可以更容易阅读和维护,这种设计进行组件模块化开发时较多。

用私有构造器或者枚举类型确保singleton

懒汉式
饿汉式
枚举类
静态内部类

用私有构造器确保不可实例化

如果不希望自己被外部实例化,将构造方法的修饰符为private

消除过期的对象引用

内存泄漏

通俗的说,无意识的对象保持,这就是内存泄漏
只要是类自己管理内存,就应该注意内存泄漏问题

如果一个对象引用被无意识的保留起来,那么,垃圾回收机制不但不会处理这个对象,而且也不会处理被这个对象引用的所有的其他对象。即便只有几个对象引用被无意识的保留,也会有许多的对象引用被排除在垃圾回收机制外面,从而占据大量的内存

消除过期引用最好方法:让包含该引用的变量结束其生命周期。一旦元素被释放掉,该元素所包含的所有对象引用都应该被清空

内存泄漏场景
1. 缓存
2. 监听器或者回调
3. Bitmap使用,及时recycle

猜你喜欢

转载自blog.csdn.net/rockykou/article/details/69487540