使用 EmptyClass 避免条件判断

    在习惯了使用基于接口的编程之后,经常会遇到这样的问题,比如,B组件需要使用实现了IA接口的A组件,但是如果在没有A组件的情况下B组件也可以正常工作,像这样:
    public   interface  IA
    {
        
void  DoWork1() ;
        
void  DoWork2() ;
    }

    
public   class  B :IB
    {
        
private  IA theA ;

        
public  B(IA a)
        {
            
this .theA  =  a ;
        }

        
public   void  DoJob()
        {
            
//
             if ( this .theA  !=   null )
            {
                
this .theA.DoWork1() ;
            }
        }

        
public   void  DoOtherJob()
        {
            
//
             if ( this .theA  !=   null )
            {
                
this .theA.DoWork2() ;
            }
        }
    }

    可以看到很多地方都要用到if(this.theA != null)进行条件判断,如果某个地方露掉了这样的判断,运行时可能就会抛出“引用为空”的异常。有没有办法来彻底避免类似的条件判断了?有,那就是EmptyClass的目的。EmptyClass实现了比如上述的IA接口,但是EmptyClass什么都不做,即EmptyClass完全由VS.NET的智能感知自动生成(声明EmptyClass时,在写完接口名后按TAB键)。
    我们看看自动生成的IA对应的EmptyClass:
    public   class  EmptyA :IA
    {
        
#region  IA 成员

        
public   void  DoWork1()
        {
            
//  TODO:  添加 EmptyA.DoWork1 实现
        }

        
public   void  DoWork2()
        {
            
//  TODO:  添加 EmptyA.DoWork2 实现
        }

        
#endregion
    }

    现在就可以在B中来避免前面的条件判断了:
    public   class  B :IB
    {
        
private  IA theA ;

        
public  B(IA a)
        {
            
this .theA  =  a ;

             // 如果引用为空,则赋值什么都不做的EmptyClass
            
if ( this .theA  ==   null )  
            {
                
this .theA  =   new  EmptyA() ;
            }
        }

        
public   void  DoJob()
        {
            
//
             this .theA.DoWork1() ; // 不在需要条件判断!!!!!!!!
        }

        
public   void  DoOtherJob()
        {
            
//
             this .theA.DoWork1() ;
        }
    }

    这个简单的小技巧,你一定已经学会了:)
    在当一个组件对另一个组件的引用可以为空的时候,EmptyClass的实例就可以作为这个引用的默认值,这样不仅没有牺牲性能(空方法调用与条件判断的开销差不多),而且使得我们的代码更漂亮、更容易阅读和维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值