Effective Java读书笔记——第二章(1刷)

本系列笔记只记录理解的内容,未理解的内容不加入笔记。

第二章的内容主要与对象的创建与销毁相关,共7条经验总结。

第1条(1):考虑用静态工厂方法代替构造器;
即用静态函数调用的形式返回一个对象,而非直接调用构造函数,如:Guava中的若干集合对象的创建,Lists.newArrayList()等。
使用静态工厂方法的优点主要有:1)清晰,可以给静态构造方法不同的命名,从而一目了然,会生成什么样的对象;2)可缓存,即可能有某个特殊需求,在整个程序声明周期当中只需要一个对象即可,此时可以在静态工厂方法中调用先前的缓存,而不去调用对象构造函数;3)可以返回原类型的任何子类,这一点有利于实现面向接口编程,例如一个List接口可以通过静态工厂方法返回ArrayList或者LinkedList,而用户只需直接调用工厂方法不用关注返回的是什么具体类型;4)在使用泛型的时候,使代码更为简洁,但这一优势当前已不明显,因为Java8之后在创建对象时只需要在声明对象时写明泛型类型,而在创建时则不需要,由编译器完成该推断;
使用静态工厂方法的缺点主要有:1)常规的静态工厂方法要求把构造函数设为私有,因此导致相应的类无法被继承;2)这些静态工厂方法与普通方法没有区别,在JavaDoc当中并不突出,因此不熟的人很难找到;3)上面两个是书本上提出的缺点,但是还有一个缺点,即当构造一个对象的时候,所需要的参数个数很多,且每次需要的参数可能都不一样,这时候静态工厂方法无法很好的处理。
常用的静态工厂方法名包括:valueOf,of,getInstance,newInstance,getType,newType。

第2条(2):遇到多个构造器参数是要考虑用构建器
正如第一条中提到的,当一个类实例化所需要的参数非常多,且每次都不相同的时候,普通的构造函数和静态工厂方法并没有办法很好的处理这种情况。(以往会使用重叠构造器的方式)
这种情况下考虑使用builder模式,即构建器,httpClient中就存在利用builder建立client的方法,如:httpClientBuilder.disableAutomaticRetries().disableRedirectHandling().build(); Builder模式的关键是要在构建一个针对该类的bulider类,而bulider当中的属性即所有新建对象需要的属性,该类的方法都是用来设置参数的,返回值类型都是这个bulider,这样就可以形成链式调用,最终有一个bulid()方法把所有的参数都传入需要创建的对象的构造器中来新建对象。
但是也要考虑构建器性能问题,如果构建器的bulid方法不是静态的,则每次都要新建一个构建起,如果是静态的则要考虑线程安全问题。

第3条(3):用私有构造器或者枚举类型来强化单例属性
单例常用的dcl模式和静态内部类模式都有比较好的效果,但是容易被反射攻击,使用枚举类型来完成单例是当前的最佳选择,在这里不再赘述,可详见单例的文章。(关于枚举的序列化和反序列化还需要深入理解)

第4条(4):通过私有构造器强化不可实例化的能力
如文本表述,没什么多说的

第5条(5):避免创建不必要的对象
即对于一些可以重用的对象,没有必要重复创建,从而增加系统内存的负担,例如:String类直接使用“”字符串形式即可,可避免创建不必要的对象;再例如:ArrayList当中存放元素的数组,在新建ArrayList的时候,所有ArrayList对象中的数组都会指向同一个长度为0的数组;再例如:Integer类的值如果在-128~128之间,则所有对象都会指向同一个Integer对象;再例如:HashMap当中的keyset方法,实际上每次返回的都是同一个set对象。
同时要注意,没有必要的时候不要使用基本类型所对应的封装类型,避免自动装箱从而新建对象。
重用对象需要考虑代码的清晰性、线程安全等问题,所以需要考虑是否有必要对对象进行重用,或者选择直接创建、复制新对象。

第6条(6):消除过期的对象引用
过期不需要的对象最好显示的置null,避免内存泄漏

第7条(7):避免使用终结方法
反正就先记住别用吧,这部分的例子理解的不透彻,可能是因为缺少实践。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值