当前位置:  编程技术>linux iis7站长之家

基于不要返回null之EmptyFactory的应用详解

    来源: 互联网  发布时间:2014-10-20

    本文导语:  有很多书上都提出过一个建议:不要返回null对象。比如下面的GetUsers方法:public class User{    public string Id { get; set; }    public string Name { get; set; }}public List GetUsers(){    List result = new List();    // search db for user    return result;...

有很多书上都提出过一个建议:不要返回null对象。
比如下面的GetUsers方法:
public class User
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public List GetUsers()
{
    List result = new List();

    // search db for user
    return result;
}
如果其他方法由GetUsersOfxxx,GetUsersByXXX之类的方法,那么就有大量
List result = new List();

考虑到这一点,可以将new List()  封装到方法中,这就是”工厂”模式了.
因为可能不是List ,也许是Stack 更或者是ObservableCollection

所以配合泛型,代码如下:
public static class EmptyFactory
{
    public static T Empty() where T : IEnumerable, new()
    {
        return new T();
    }
}

使用如下:
List emptyList = new List();
Stack emptyStack = new Stack();
ObservableCollection emptyObserable = new ObservableCollection();

emptyList = EmptyFactory.Empty();
emptyStack = EmptyFactory.Empty();
emptyObserable = EmptyFactory.Empty();
虽然这样写可以满足要求,但是可以发现基本没什么好处,写EmptyFactory还不如new 来得快。
不过如果能够缓存对象的话,也许EmptyFactory有作用。
考虑到这一点,为EmptyFactory增加缓存机制的代码如下,使用Dictionary 来实现
代码如下:

public static class EmptyFactory
{
    private static Dictionary cacheEmptyObjects =
                     new Dictionary();
    public static T Empty() where T : IEnumerable, new()
    {
        Type genericType = typeof(T);
        if (cacheEmptyObjects.ContainsKey(genericType))
        {
            return (T)cacheEmptyObjects[genericType];
        }
        else
        {
            T tempEmptyObject = new T();
            cacheEmptyObjects.Add(genericType, tempEmptyObject);
            return tempEmptyObject;
        }
    }
}

测试代码如下:

 

不过这种方法有一个缺陷,对于值类型而言,需要装箱。

其根本原因是因为EmptyFactory不知道T是什么,如果EmptyFactory知道T的话,那么就可以使用Dictionary 的缓存了。

解决这个问题的思路是将EmptyFactory变成泛型类:

代码如下:

代码如下:

public static class EmptyFactory where T : IEnumerable, new()
{
    private static Dictionary cacheEmptyObjects = new Dictionary();
    public static T Empty()
    {
        Type genericType = typeof(T);
        if (cacheEmptyObjects.ContainsKey(genericType))
        {
            return cacheEmptyObjects[genericType];
        }
        else
        {
            T tempEmptyObject = new T();
            cacheEmptyObjects.Add(genericType, tempEmptyObject);
            return tempEmptyObject;
        }
    }
}

使用的时候,只需要

当然也可以EmptyFactory.Empty();

为什么不用Enumersble.Empty方法呢?

因为Enumerable.Empty 返回的是IEnumerable对象。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java小应用程序(Applet)能有返回值吗?
  • 向数据库中插入数据并返回当前插入的行数及全局变量@@IDENTITY应用
  • redat as 4.0下如何获取应用端口的返回值,急、急、急!
  • 在Web环境下SQL Server存储过程返回结果集如果需要滚动就出错:Error setting up static cursor cache。而在普通应用中中正常
  • JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码
  • C++ Bitsets 成员 any():如果有任何一个位被设置就返回true
  • 如果用类作返回值,在JAVA中返回的是地址还是要返回的类的一个拷贝???
  • C++ Double Ended Queues(双向队列) 成员 empty():返回真如果双向队列为空
  • 请问在脚本里怎么得到一个程序运行的返回值,脚本怎么返回值?
  • C++ I/O 成员 bad():如果出现错误则返回true
  • linux c编程:怎么从键盘只读取一个字符就返回,不要回车后才返回
  • C++ I/O 成员 fail():如果出现错误则返回true
  • 在shell中,返回值为零表示成功,非零值为失败。 这个返回值存放在哪个变量中?
  • C++ Stacks(堆栈) 成员 empty():堆栈为空则返回真
  • system()函数返回什么值时,该函数执行成功?返回什么值时,执行出现错误?谢谢
  • C++ Maps 成员 empty():如果map为空则返回true
  • java 中 SOCKET 的ACCEPT函数有返回值吗?怎样返回才是正常的?
  • C++ Priority Queues(优先队列) 成员 empty():如果优先队列为空,则返回真
  • 当close(socket)时,为什么linux下slect不返回而windows下就返回??????????
  • C++ Strings(字符串) 成员 empty():如果字符串为空,返回真
  • 公司要给客户做报表,从数据库返回数据,他们死活要返回的格式为Excel格式,请问我怎样才能把数据库返回的数据存为Excel的格式?
  • C++ Bitsets 成员 none():如果没有位被设置则返回true
  • linux串口读取read函数始终返回值为1,没有返回读到的字符数
  • C++ MultiMaps 成员 empty():如果multimap为空则返回真
  • 为什么一个ejb的bean中的一个方法在返回一个ResultSet时报错,如何返回一个结果集
  • C++ Queues(队列) 成员 empty():如果队列空则返回真
  • socket的close是立刻返回,还是等四路握手过程完成再返回


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3