lgxqf  

第二章 Creating and Destroying Objects 创建和销毁对象

 

Item 1: Consider static factory methods instead of constructors

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

 

总结: 尽量通过静态方法来创建对象,它比构造创建对象的方法灵活很多。

 

静态工厂方法的优点:

1.与构造函数不同,它有名字

2.直接调用它即可,无需构造新的对象。Integer.valueOf(String s)

3.与构造函数不同,它们可以返回任何子类类型的对象。这样在返回对象时有很大的灵活性

4.可以简化参数化类型对象的创建,如:

         public static <K, V> HashMap<K, V> newInstance()

         {        return new HashMap<K, V>();         }

         Map<String, List<String>> m = HashMap.newInstance();

        

         原始创建方法:

         Map<String, List<String>> m = new HashMap<String, List<String>>();

 

缺点:

1.若只提供静态工厂方法创建对象,且不提供publicprotected构造函数,则该类无法被继承

代码
代码示例:
    
class Car{
    
        
protected Car(){}
        
private static final Car car = new Car();
    
        
class BMW  extends Car{}
        
class BenZ extends Car{}
        
        
//返回不同的子类对象
        public static Car getCarByType(int type){
            
switch (type){
            
case 1return car.new BMW();
            
case 2return car.new BenZ();
            
case 3return car;
            
defaultreturn null;
            }
        }
        
        
//单例模式
        public static Car getInstance(){
            
return car;
        }
    }

 


Item 2: Consider a builder when faced with many constructor parameters

第二条:当构造函数有很多参数时考虑用builder

 

总结: 若将来构造函数的参数有可能多于4个,考虑用builder

 

1.当构造函数的参数多于4个时或在未来有可能多于4个时考虑用builder来提高类的易用性和可读性

 


Item 3: Enforce the singleton property with a private constructor or an enum type

第三条:通过枚举类类型或私有构造函数来强制实现单例模式

 

总结: 枚举单例模式是实现单例模式最好,最简单的方式

代码示例:
//  枚举单例模式
    public enum Elvis {
    
    INSTANCE;
    
    
public void leaveTheBuilding(){}
    }



Item 4: Enforce noninstantiability with a private constructor

第四条:构造私有化使对象不能实例化

 

总结: 强制一个类不能实例化的最好方式是 私有化其构造函数,并在构造函数中抛出异常,防止类内的函数创建该类实例

 

1.对于一些工具类,实例它是没有意义的通过此方法可以强制不能实例化工具化的对象。

代码示例:
    
public class UtilityClass {

    
private UtilityClass() {
            
//防止类内的函数调用构造函数创建对象
            throw new AssertionError();
        }
        
    }



Item 5: Avoid creating unnecessary objects

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

 

总结: 避免创建不必要的临时对象

 

String s = new String(“abc”); 创建了两个对象

String s = “abc”;\\比前者效率高,只创建了一个String对象

 

 


Item 6: Eliminate obsolete object references

第六条 减少废弃的对象引用

 

1.废弃的引用设成null空值,尽量减少引用的有效域,如在{} 建立一个对象,{} 引就无效了。详见第45

 


Item 7: Avoid finalizers

第七条:避免使用finalizer

 

总结: 非必要,尽量不用finializer

 

1.Finalizers 是无法预测,很危险,而且一般情况下是不必要的。

2.可以自定义一个方法来显示地释放资源,并在try-finally 中调用该自定义方法,保证即使发生活异常时,它也会被执行,从而释放资源。

3.如果非要使用finalizer,切记在finializer中调用super.finailize

代码示例:
    
protected void finalize() throws Throwable {
        
try {
        ... 
// Finalize subclass state
        } finally {
            
super.finalize();
        }
    }



 

 


posted on 2010-01-26 00:14  Justin_Ma  阅读(209)  评论(0)    收藏  举报