关于返回 Null 值的问题

 

我总感觉一个方法返回null值有问题。 当读了Misko Hevery关于how to think about OO的博客文章后,又让我想起这个问题。

我感觉返回null值是有问题的,它大量的被使用在一个方法有不同的返回类型时。 简单的用谷歌搜索一下“returning null”,你就会发现有建议把返回类型做成一个null对象。 返回一个Null对象在某些情况下是合适的,但并不适合当你需要向客户端传送两种不同的东西的情形。

用Misko重构的一段代码来说明这个问题。 他重构的是一段登录代码(我非常喜欢他的过程),这段代码大概是这个样子:

Cookie login(Ldap ldap) {
    if ( ldap.auth(user, password) )
      return new Cookie(user);
    return null;
}

从这段代码,可以看出两种情况(从结构上讲)

1. 如果认证通过, 客户端会被通知验证成功, 生成一个新的Cookie
2. 如果认证失败, 则通过返回的null值通知客户端

客户端的方法应该是什么样的?

public void authenticateUser(User user) {
    Cookie userCookie = user.login(ldap);
    if (userCookie == null) {
        //notify someone that auth failed
    } eles {
        //register them as logged in
    }
}

我们在两个地方做了相同的事情,只是在语法上有稍微的不同,每个地方,我们都要检查验证是否成功。 如果我们使用IoC(反向控制)模式,或“Tell Don’t Ask”模式或“Hollywood原则”,会如何?

Cookie login(Ldap ldap, AuthenticationRegistry authenticationRegistry) { if ( ldap.auth(user, password) ) authenticationRegistry.authSucceeded(new Cookie(user)); authenticationRegistry.authFailed(user); }

客户端:

public void authenticateUser(User user) {
    user.login(ldap,this);
}

public void authSucceeded(Cookie cookie) {
    //register them as logged in
}

public void authFailed(User user) {
    //register them as auth failed
}

新代码稍微有点复杂,但我感觉它很清晰,实现的更直接。 现在我们的两个实体能够相互通信,我们定义了它们通信的方式。 我喜欢Misko的重构,我只是更进了一步。 好坏可以再讨论,但我想,如果你遇到了这种需要返回两种情况的方法时,IoC是你应该的选择。

本文英文原文链接:Returning Null

翻译:http://justjavac.com/java/2012/05/18/returning-null.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值