《Effective Java》创建和销毁对象

第一条:考虑用静态工厂方法代替构造器


静态工厂方法对比构造器的优势在于
  1.  前者有名称
  2. 不必在每次调用的时候都创建一个对象 ,因为构造方法不能显示调用,那么实际也是第一点的扩展。
  3. 可以返回任何类型的返回值。比较经典有单例模式。
  4. 在创建参数化类型实例的时候使代码变得更加简活(Java7不支持)类似这种简化  Map<String,List<String>> m = HashMap.newInstance()
静态工厂方法的缺点:
    类如果不含有共有的或者受保护的构造求就不能被子例化
    与其他的静态方法没有任何区别。



· 前者有名称

这里要明确的是在加载Java类的时候的各个部分的顺序。


初始化的顺序:自动初始化(不管是静态或者是非静态的初始化部分)的会在调用构造器之前发生、先静态对象后非静态对象。参考《Think In Java》p97

第二条:遇到多个构造器方法时要考虑用构造器



如果参数过多,应当考虑使用setter函数来赋值。这个模式叫做JavaBean模式 ,但是这种方式会有线程不安全的问题。

Builder模式解决了上诉问题(从来没用过-。-)

什么是builder模式。?

第三条用私有构造器或者枚举类型强化singleton属性



私有构造器。



第四条通过私有构造器强化不可实例的能力



显示的私有构造器的类是不能被实例化的。



第五条避免创建不必要的对象



String s = new String("gaga");
String s = "gaga"
的区别


下面这种方式只创建了一个对象,而上面的每次执行都创建一个新的实例




创建和销毁小对象是非常廉价的,维护自己的对象池来避免创建对象并不是一种好的做法。


除非池中的对象是非常重量级的比如数据库连接池。

一般而言维护对象池会增加内存占用,还会损害性能。



第六条 消除过期的对象引用



Java的GC是很神秘莫测的,虽然说不需要你亲自delete对象,但是。。。你要手动接触引用来方便GC回收,而且还不一定回收。。这是看之前自己对标题的一点认识。


“在支持垃圾回收的语言中内存泄露是很隐蔽的”

内存泄露的常见来源。

第七条 避免使用终结方法



“finalizer是不可预测的,也是很危险的,一般情况是不必要的”

finalize的时间是任意长并且不可测的,

由此,及时执行finalize是垃圾回收方法的一个主要功能。 这种方法在不同的JVM事先都大不一样

一般来说造成时间不可测的原因在于终结方法线程的优先级要比一般方法线程的优先级要低的多。

Java不仅不保证finalize何时被执行,甚至不保证会不会被执行。

使用finalize有一个严重的性能损失。

那么如何终止呢,只需要显示调用close之类的函数就行。与try-finally结合以保证一定被closed


另外,finalize的真正用处:

安全网
终止非关键的本地资源


总之:不要轻易使用啦。。。































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值