effective java 笔记之创建和销毁对象

1、考虑用静态工厂方法代替构造函数

实际上是一个普通的静态方法,该方法返回的是类的一个实例。如:

public static Boolean valueof(boolean b){
    return (b?Boolean.TRUE:Boolean.FALSE);
}

好处:

1)具有名字,清楚地返回对象名,使客户代码便于阅读及使用
2)每次被调用的时候,不需要创建一个新的对象(单例设计模式)
应用:如果一个程序需要频繁地创建对象,并且创建的代价比较高昂的话
3)与构造函数不同,可以返回一个原返回类型的子类型对象,在选择被返回对象的类型时有更大的灵活性
应用:返回一个对象,而且不想该对象的类成为公有的。使用这种方法把具体实现的类隐藏起来。适用于基于接口的框架结构,如Collections中的集合接口实现,大多是通过Collections中的静态工厂方法被导出,所有返回对象的类都不是公有的。

缺点

1)类中如果不含有公有的或者受保护的构造函数,就不能被子类化。
2)与其他的静态方法没有任何区别

2、使用私有构造函数强化singleton属性

singleton是指只能实例化一次的类,通常用来代表那些具有唯一性的系统组件,如视频显示或文件系统。

3、通过私有构造函数强化不可实例化的能力

如Collections以及自己写的工具类的使用,对工具类进行实例化是没有任何意义的。然而,在缺少显示构造函数的情况下,编译器会自动提供一个无参的默认构造函数。为避免这种情况,我们可以让这个类包含单个显示的私有构造函数。

public class Util{
    //显示私有构造函数
    private Util(){}
}

缺点:
使得一个类不能被子类化

4、避免创建重复对象

重复使用同一个对象,而不是每次需要的时候就创建一个功能上等价的新对象。为此,通常可以使用静态工厂方法而不是构造方法。另外,静态域也是可取的。但是小对象的创建与回收是很廉价的,通过创建附加的对象,可以使得程序更加清晰,简洁,也是一件好事.

如用String s = "hello"代替String s = new String("hello")

5、消除过期的对象引用

尽管java中提供了垃圾回收功能,但不代表我们就不再需要考虑内存管理的问题了。为防止内存泄露,可以使用WeakHashMap代表缓存

6、避免使用终结函数

终结函数通常是不可预测的,常常也是危险的,因为终结函数并不能保证会被及时地执行。所以,时间关键的任务不应该由终结函数来完成,如文件的关闭。可以使用显示终止法,而且一般和try-catch综合使用:

Foo foo = new Foo(...);
try{
    //do something
}finally{
    //foo.terminate();//终结
}

除非是作为安全网(要在子类中调用super.finalize())或者是为了终止非关键的本地资源,否则请不要调用终结函数finalize()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值