IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    对null Object的使用的认识和思考

    longhao (longtask@gmail.com)发表于 2008-07-17 09:18:30
    love 0

    本次编码的时候犯了一个愚蠢的错误,在几乎所有的biz和manager层加了一个public static final String NULL = null;以此来作为统一的空对象,而这个完全是多次一举,因为null就可以直接代替,就此看来自己完全没有一点点面向对象的概念。为了防止犯类似的错误,决定查询资料好好讨论一下null Object的使用。

    1:返回一个空的域对象而不是null;
    在基于领域模型的设计中,在底层定义的domain Object在数据库查询的时候可以返回为空,在此我们先定义一个Do对象。
    public class Tree{
    private Integer height;
    private Integer age;
    private String name;
    private Double diameter;
    //树叶的域对象;
    private Leaves leaves;
    // get set methods……
    }
    2:在DAO层封装和数据库交互的基本方法后,我们在business层开始对业务逻辑进行简单的封装。当我们提供一个findTree的方法的时候,如果在数据库中查询一个年龄为16岁的tree对象为空,一般的情况下我们返回为null对象,这样就会导致程序在要取值的时候必须判断是否为空,实例如下:
    public class TreeBiz{
    public Tree findTree(Tree tree){
    //在这个地方思考一下,如果返回的tree为空的话,下面的方法调用的问题;
    // treeDao.findTree(tree)……
    }
    public String treeName(Tree tree){
    return tree.getName();
    }
    }
    3:如果获取的tree对象为空的话,就会报空指正的错误。所以必须加上if(tree != null)……而这样就会导致程序中过多的判断了空,不够简洁,同时也很容易出错。
    如果我们在域对象中重新定义一个空的对象,然后在dao层封装一下,代码的健壮性就会增强了很多。示例如下:
    public class Tree{
    //增加一个空的tree对象
    public static final Tree NULL = new Tree();
    private Integer height;
    private Integer age;
    private String name;
    private Double diameter;
    //树叶的域对象;
    private Leaves leaves;
    // get set methods……
    }
    4:在DAO层封装一下获取tree对象的方法
    public class TreeDao{
    public Tree findTree(Tree tree){
    Tree tree = ……
    if(tree == null){
    //返回一个空的Tree对象
    return Tree.NULL;
    }else{
    return tree;
    }
    }
    }
    这样在业务逻辑层调用TreeDao方法的时候就很不会出现对象空指针的问题,增强了程序的健壮性。
    有人或许会问,为什么在为空的时候不直接 new Tree(), 首先:new一个对象需要分配新的内存开销,而static final的NULL对象则在内存中有一块无法改变的存储空间,降低了系统的开销;其次,NULL对象在执行期就被初始化,返回NULL只用指向该内存地址,而不是重新分配地址,提高的性能。
    使用NULL Object模式可以确保在DAO层返回有效的对象,及时在查询失败的时候也是如此。这些代表失败的对象“什么也没有做”!




沪ICP备19023445号-2号
友情链接