编码建议之对象的创建和销毁

创建和销毁对象

1. 考虑使用静态工厂方法代替构造器
//类可以提供一个静态工厂方法,它只是返回一个类的实例的静态方法.(适合不可变类,将构建的实例缓存起来)
//惯用名称(静态工厂)
这里写图片描述

2:遇到多个构造器参数时要考虑构建器
//可以很好的扩展到大量的可选参数,使用Builder模式.通常最好一开始就使用构建器

3:用私有构建器或者枚举类型强化Singleton属性
//要把构造器保持为私有的,并导出公有的静态成员,以便允许客户端访问该类的唯一实例.

//实现Singleton类变成可序列化(Serializable),仅仅实现可序列化接口不够的,
为了维护并保证单例,必须声明所有实例域都是瞬时(transient)的,并提供一个readResolve方法,否则每次反序列化一个序列化的实例时,都会创建一个新的实例.

4:通过私有构造器强化不可实例化能力
//编写只包含静态方法和静态域的类,使用这种方式可以将基本类型的值或者数组类型上相关方法组织起来.(工具类).

5:避免创建不必要的对象
//一般来说,最好能重用对象而不是在每次需要的时候就创建一个相同功能的新对象.如果对象是不可变(immutable)的或者是已知不被修改可变对象,它就始终可以被重用的.对于同时提供了静态工厂方法和构造器的不可变类,通常使用静态工厂方法.

//真正使用对象池的典型对象是数据库连接池.建立数据库连接池代价非常昂贵,因此重用这些对象非常有意义.(当你应该重用现有对象的时候,请不要创建
新的对象)—->即对象池是创建对象非常昂贵

//通过延迟初始化,什么时候用,什么时候初始化.

//优先使用基本类型而不是装箱类型,在实体类,DAO层,业务层使用装箱类型,在局部变量时使用基本类型.

6:消除过期的对象引用
//缓存:使用WeakHashMap代表缓存,当缓冲中的向过期时,就会自动被删除.记住只有当所要的缓存项的生命周期是由该键的外部引用而不是由值决定时,才有用处.可以通过定时器来定期清理缓存,使用LinkedHashMap类的removeEldestEntry()实现缓存策略.或者直接使用java.lang.ref.

//常见的内存泄露:缓存;监听器和其他回调;解决方法是保存它们的弱引用(weak reference,例如只保存它们的WeakHashMap)

7:避免使用终结方法
//终结方法(finalizer)通常是不可预料的,也是很危险的,一般情况下是不必要的.使用终结方法会导致行为不稳定,降低性能,以及可移植性问题.

//在Java中,一般用try-finally快来完成类似的工作(c++析构器工作)

//终结方法不能保证会被及时的执行.从一个对象变为不可达时,到它的终结方法被执行,而花费的时间是任意长的.这意味着,注重时间的任务不应该由终结方法来完成.(例如用终结方法来关闭已打开的文件,因为已打开的文件的描述符是很有限的资源.由于JVM会延迟执行终结方法,所有大量的文件会保留打开状态.当一个程序不能打开文件的时候,它可能会运行失败)

//使用终结方法有一个非常严重的(Servere)性能损失

//解决方法:提供显式的终结方法,并要求该类的客户端在每个实例不在有用的时候调用这个方法.(该实例必须记录下自己是否已经被终止了,显式的终止
方法必须在一个私有域中记录下”该对象已经不再有效”);通常由try-finally块结合该方法使用,以确保及时终止.

猜你喜欢

转载自blog.csdn.net/a169388842/article/details/79058346