为了账号安全,请及时绑定邮箱和手机立即绑定

LBYL和EAFP在Java中?

LBYL和EAFP在Java中?

繁星点点滴滴 2019-10-16 13:42:04
我最近正在自学Python,并发现了有关代码执行之前的错误检查的LBYL / EAFP习惯用法。在Python中,似乎可接受的样式是EAFP,并且似乎与该语言配合良好。LBYL(大号 OOK 乙安伏ý OU 大号 EAP):def safe_divide_1(x, y):    if y == 0:        print "Divide-by-0 attempt detected"        return None    else:        return x/yEAFP(它的ê asier到一个 SK ˚F orgiveness比P ermission):def safe_divide_2(x, y):    try:        return x/y    except ZeroDivisionError:          print "Divide-by-0 attempt detected"        return None我的问题是:我什至从未听说过使用EAFP作为主要的数据验证结构,它来自Java和C ++背景。EAFP是在Java中明智使用的东西吗?还是异常产生了太多开销?我知道只有在实际引发异常时才有开销,因此我不确定为什么不使用更简单的EAFP方法。只是偏爱吗?
查看完整描述

3 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

就个人而言,我认为这是按惯例支持的,EAFP绝不是一个好方法。您可以将其视为等同于以下内容:


if (o != null)

    o.doSomething();

else

    // handle

相对于:


try {

    o.doSomething()

}

catch (NullPointerException npe) { 

    // handle

}

此外,请考虑以下事项:


if (a != null)

    if (b != null)

        if (c != null)

            a.getB().getC().doSomething();

        else

            // handle c null

    else

        // handle b null

else

    // handle a null

这看起来可能不太优雅(是的,这是一个粗糙的示例-忍受),但是与处理所有错误相比,它为您提供了更大的粒度来处理错误,然后将其包装在try-catch中以获取该错误NullPointerException,然后尝试弄清楚在哪里以及为什么得到它。


我看待它的方式EAFP绝不应该使用,除非极少数情况。另外,由于您提出了问题:是的,即使未引发异常,try-catch块也确实会产生一些开销。


查看完整回答
反对 回复 2019-10-16
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

除了Python和Java中异常的相对代价外,请记住,它们之间在哲学/态度上存在差异。Java试图对类型(以及其他所有类型)非常严格,要求对类/方法签名进行明确,详细的声明。它假定您在任何时候都应该确切地知道您正在使用什么类型的对象以及它能够做什么。相反,Python的“鸭子类型”意味着您不确定(也不应该在意)对象的清单类型是什么,只需要在请求时就注意它会嘎嘎作响。在这种宽容的环境中,唯一理智的态度是假定事情会成功,但如果事情没有后果,则要做好应对的准备。Java的自然限制 非常适合这种随意的方法。(这并不是要贬低方法或语言,而是要说这些态度是每种语言习语的一部分,并且在不同语言之间复制习语通常会导致尴尬和沟通不畅。)

查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 624 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信