Effect Java 学习笔记-对象的创建与销毁
第一条、静态工厂替代构造器
1.更高的可读性,可命名。
2.可以控制对象的数量,统一入口生成,单例、对象重用
3.获取对象更加灵活,可以返回对象的所有子类
通过静态类暴露API,可以隐藏API实现类,使API更加的简洁(Collections)
服务提供者框架,通过服务访问API获取服务对象,配合提供者注册API可以灵活替换不同的实现,从而实现了用户以及服务访问API和具体实现的解耦。
4.参数化使代码更加简洁,新版jdk已经实现了类型推导
第二条、遇到多个构造器参数时要考虑使用构造器
1.重叠构造器,调用多参构造器初始化虽然代码简洁但不易懂,没有可读性,而且当参数数量增加时,构造器难以维护,调用处也容易出错,需要自己核对参数顺序以及数量。
2.Javabeans模式,解决了可读性问题但是对象初始化被拆分,没有原子性,无法满足多线程情况。
3.Builder模式,通过增加builder对象添加调用参数解决了可读性问题,再通过builder内部调用目标对象构造方法实例化对象保证了原子性
tip:可以在builder中做参数校验,public interface Builder<T>{public T builder();}了解一下
第三条、用私有构造器或者美剧强化Singleton属性
1.工厂方法实现单例的好处在于提供了灵活性,可以控制对象的返回,控制对象是唯一。
2.序列化,单例模式在这里有个坑,反序列化的时候默认会new 一个对象,破坏单例,可以增加private Object ReadResolve(return INSTANCE;)避免这种情况,java在序列化时会检查对象中是否实现这个方法,如果有,则会在序列化时做特殊处理,并在反序列化时通过调用该方法获取对象,从而保证对象唯一。
tip:通过单元素枚举可以实现一个相对完美的单例
第四条、不需要实例化的对象增加private的构造器,防止误导他人
第五条、避免创建不必要的对象
1.不可变对象尽量避免用构造器去创建对象,如果一个对象同时提供了构造器和工厂方法,尽量使用工厂方法。
2.一些频繁调用的方法中,如果有一些不需要变化的对象,可以放在类变量中,如果初始化开销比较大,可以实现延迟加载(延迟加载会增加方法复杂度,如果开销不大,避免使用)
3.自动装箱,虽然新版本jdk支持基本类型以装箱基本类型的混用,但混用会导致自动装箱,影响性能,所以优先使用基本类型,避免无意识的自动装箱。
第六条、消除过期对象
1.当自己维护内存是,要注意清除不需要对象的引用(一些引用业务上以及失效,但是引用仍然保留(数组中常见),这种情况要手动消除引用通知gc回收)
tip:缓存,WeakHashMap了解一下
第七条、慎用中介方法finalize()