《Effective Java》笔记(一)

来源:互联网 发布:gsm是什么网络 编辑:程序博客网 时间:2024/06/08 16:41

第2章 创建和销毁对象

第1条:用静态工厂方法代替构造器

优势:
可以有名称更易于阅读;
不必再每次调用他们的时候都创建一个行的对象;
可以返回原返回类型的任何子类型的对象;
在创建参数化类型实例的时候,他们是代码变得更加简洁;
缺点:
类如果不含public或者protected的构造器,就不能被子类化;
他们与其他静态方法实际上没有任何区别;

第2条:遇到多个构造器参数时考虑使用builder

优势:
提高代码的可读性;
保证创建对象的不可变的安全性;
可扩展性;
缺点:
略微增加开销;

第3条:用私有构造器或者枚举类型强化Singleton属性

完美单例实现方式:

public class Singleton {    private Singleton() {    }    public static Singleton getInstance() {        return SingletonBuilder.mSingleton;    }    private static class SingletonBuilder {        private static final Singleton mSingleton = new Singleton();    }}

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

即所谓的工具类,不需要创建实例,仅仅使用静态方法。

public class Util {    private Util() {        //反射保护        throw new RuntimeException("this class can't be instantiated");    }}

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

不必考虑“小”对象,仅当创建一个对象的代价非常昂贵时才避免重复创建。
1.适时使用成员变量代替局部变量
假设一个方法经常被调用,并且在方法体内会创建“不变”的局部变量,这种情况则可以将这些局部变量变为成员变量,并在适当的时候初始化。
2.使用对象池
但要注意只有非常重量级的对象才有必要使用对象池!
缺点:维护复杂,增加内存占用,损害性能。

第6条:消除过期的对象引用

当一个对象不再使用时,及时清除引用,否则会导致内存泄露。
特别注意一下三种情况:
类是自己管理内存时,如集合的存储对象;
容易被遗忘的缓存;
监听和回调,设置监听,却没有显式的取消注册,则listener对象会一直被持有引用。可以采用弱应用来保存listener;

第7条:避免使用终结方法(finalizer)

0 0