Effective Java读书笔记 第二章: Creating And Destroying Objects

Item 1,考虑使用静态工厂方法而不是构造方法来创建对象

好处

1.使用重载构造方法并不是一个好主意,有时候你根本记不清哪个是哪个。可以尝试用静态方法来返回一个类的对象,只要取名得当,可读性可以增强。如果一个类需要多个构造方法,那么你可以考虑使用不同的静态方法来替代它们,并且分别使用可读性很强的方法名,这样使用者并不需要去查阅相关的文档就可以直接使用。

2.使用静态方法相对于构造器来说还有一个好处就是,这样并不要求你每次调用都创建一个新的对象。尤其是当创建对象的开销很大的时候,可以大大地提升程序的性能。

举个例子,Collections类的构造函数其实是private的,为什么呢,因为该类的作用本身是创建其它容器类,并不需要其自身,所以为了减少对象创建的开销,就强制无法创建Collections对象。

3.使用静态方法的第三个好处,和构造方法不一样的是,除了可以返回该类本身的实例,还可以返回该类的子类的实例,这样为程序带来了很大的灵活性。

坏处

1.那些没有public或者protected构造函数的类无法被继承,那么无论这个类写得再好,也无法实现重用。

2.用来创建对象的静态方法和其它的静态方法并没有进行区分。但是呢,如果名称使用得当,可以减少这个问题带来的影响。比如,valueOf和getInstance两个方法渐渐的就被普遍使用。常常使用String.valueOf(参数),比如传递一个整型,或者任意对象,然后得到其值。常常使用一个类的getInstance来创建一个其对象。


如果没有特殊的要求,还是使用构造函数。


Item 2,使用private构造函数来强制实行Singleton

Singleton有2种方式可以实现,原理都是使用一个public static的该类的对象加上一个private的构造函数。

第一种:

直接创建一个public static final Something INSTANCE = new Something();

然后将来要调用就简单地使用Something.INSTANCE就行


第二种:

当然,还是要创建一个上面的变量,然后添加一个static方法

public static final Something getInstance(){

    return INSTANCE;

}


第一种可能更加直观

第二种更加灵活,将来你要是不想将它弄成Singleton了,可以不用修改API。


Item 4,避免重复创建对象

举个简单的例子,String s = new String("creating a string object");

上面的语句每次都会创建一个String对象(如果是第一次调用,会在常量池中创建一个字符串常量),我们真正需要使用到的,其实是这个字符串常量,而这个字符串对象s并不需要每次都创建一个新的,假如该语句频繁地被调用,就会创建很多没有实际用途的对象,浪费系统资源。

在类的方法中,我们有时候会无意识地去创建一些局部对象变量,有时候这些变量也许只是一个常量值,一旦初始化,就不需要再创建了。所以有时候我们在创建局部的对象变量的时候最好多想想,这个方法是不是可能会被频繁地调用,这个局部变量是不是可以写成成员变量,或者static成员变量,然后是不是可以简单地通过构造方法或者static代码块就初始化了。将来遇到方法调用的时候,只是赋值或者简单地使用这些变量就行了,就避免了不必要的对象创建。

Java语言本身也提供了很多静态方法,使得你只用创建一次对象,而不是老在创建。比如Boolean.valueOf(String s),无论你使用多少次该方法,都只会创建一个Boolean对象,减少了系统的负担。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章