您的位置:首页 > Web前端

effective java之创建与销毁对象

2012-10-31 23:56 295 查看
最近朋友推荐了一本书《Effective Java》,觉得写得不错,写点总结笔记,以备后用。

一、创建对象

1、考虑静态工厂代替构造器

优点:(1)有明确名称。可以理解成,定义的静态方法可以给出明确的名称,而不是像构造器只有类名。

(2)可实现单例,不必每次创建新对象。这就不解释了,单例模式

(3)静态工厂可以返回该类的子类。很犀利,类似静态工厂模式,返回希望的子类。当然,这其中提到了一个服务提供者框架,暂时只能理解个大概,日后再仔细梳理下,写个总结。

(4)使代码更简洁。例如:

Map<String,List<String>> map=new HashMap<String,List<String>>();
//静态方法后
public static <k,v> HashMap<k,v> getInstance(){
return new HashMap<k,v>();
}

缺点:类如果不含有公有或者受保护的构造器,就不能被子类化。但是,正因为这样,我们却提倡复合替代继承。即通过委托对象去实现继承。感觉说的缺点又变成优点啦。。。

2、Builder模式替代重叠构造器

当出现多个属性,例如有10个属性,但每个用户使用属性的组合都不一致,这个时候怎么办?

最先想到的是给出所有种类的构造器。这个方法很糟糕,我们将给出非常多的构造器,用户调用时也可能出错。

当然我们可以使用javabean的setter方法,但是书中提到构造器会被分到几个调用中,导致javabean处于不一致状态。说的这种情况没遇到过,也只能囫囵吞枣啦 - -

那么在这种极端的情况下推荐使用Builder模式,下次给出demo连接。

3、推荐使用枚举实现单例。为了实现单例对象的序列化,光“implements Serializable”是不够的,还需声明所有实例域都是瞬时的,光读着就觉得麻烦!可喜的,枚举emun无偿的提供了序列化机制。

4、通过私有构造器限制实例化对象。例如我们在使用工具类的时候,我根本不需要工具类的对象,只是需要工具类的方法,但java中方法又不能单独存在,只能依据类或对象存在。所以我们把工具类的构造器私有化,前提是你不想继承该工具类。通过验证java.lang.Math 类的构造就是私有的。这点还真学习到了。

5、避免创建不必要的对象

String str=new String("kyle1970"); //不要这么做,本来java就给我们字符池来优化字符串的创建与使用,这样做非常糟糕,多创建一个毫无意义的对象,但面试题又非要考这些。

建议读取配置文件的时候,一定放在静态代码块里,不要放在对象方法里

二、销毁对象

1、消除过期对象引用。例如我们在定义一个数组array[size] 当我们进行数组长度减1的操作array[size--],那么这个时候将产生一个过期引用,即原来的array[size]这个对象虽然被剔除了数组中,但是它却不会被垃圾回收器回收,因为它被引用着,这就叫过期引用,将会一直在内存中。

那这个时候怎么办呢?我们可以在剔除元素操作之后,写一句array[size]=null;即把元素剔除后,在把元素的引用设置成null,那么被剔除对象就会被垃圾回收器回收啦。晕了吗???

2、避免使用 fialeze 方法。fialize方法是在对象被垃圾回收器回收前的必要操作。首先,fialize方法由于线程优先级的原因,不能保证被调用,可能会产生阻塞,导致内存溢出。其次,调用fialize并不能终结父类。

行吧,暂时总结到这,后续慢慢补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: