当前位置: 首页 > 知识库问答 >
问题:

如何更好地重构在Java中可以返回null的方法链?

龚勇锐
2023-03-14

我有这样的代码

obj1 = SomeObject.method1();
if (obj1 != null) {
  obj2 = obj1.method2();
  if (obj2 != null) {
     obj3 = obj2.method3();
     if (obj3 != null) {
              ............


     return objN.methodM();

   }
  }
 }
....

我有近10个台阶。它看起来非常脆弱而且容易出错。有更好的方法检查空链接方法吗?

多谢了。

共有2个答案

劳宇
2023-03-14

要回答好这个问题,需要更多的语境。

例如,在某些情况下,我主张将内部的if语句分解成它们自己的方法,遵循“每个方法都应该完全正确地做一件事”。在这种情况下,调用该方法并检查是否为null就是一件简单的事情:如果它为null,则返回(或抛出,这取决于您的实际需要)。如果不是,则调用下一个方法。

不过,我最终怀疑这是一个设计问题,如果不深入了解正在解决的问题,解决方案是不可知的。

就目前的情况而言,这一段代码需要深入了解(我怀疑是这样的)多重职责,这意味着几乎在所有情况下,需要新的类、新的模式、新的接口或某种组合来使其既干净又易懂。

冷吉星
2023-03-14

这是Java中null引用的常见问题。

我更喜欢使用&链接:

if (obj1 != null && obj1.method1() != null && obj1.method1().method2() != null)
 类似资料:
  • 问题内容: 我有这样的代码: 我有将近10个步骤。看起来非常脆弱且容易出错。有没有更好的方法来检查空链方法? 谢谢。 问题答案: 这是Java中引用的常见问题。 我更喜欢与:

  • 问题内容: 通常,您可能有一种检查大量条件并返回状态的方法(现在先说布尔值)。最好定义一个标志,在方法中进行设置,然后在最后返回: 还是知道方法的结果后简单地返回就更好/更正确? 现在显然可以有try / catch块和所有其他类型的条件,但是我认为概念很明确。意见? 问题答案: 如果您要调用的方法数以千计,那么尽早返回会更好地提高性能。 如果没有,那么我宁愿延迟归还,因为这样可以提高可读性。 请

  • 问题内容: 如果是这样,在什么情况下? Javadoc和JPA规范什么也没说。 问题答案: 你是对的。JPA规范对此一无所获。但是 Java Persistence with Hibernate的第二版书 说: 如果查询结果为空,则返回null 调用query.getResultList()时,没有结果的Hibernate JPA实现(实体管理器)返回null。 更新 正如某些用户指出的那样,最新

  • 接口列表的迭代器方法可以返回null吗? 链接:https://docs.oracle.com/javase/7/docs/api/java/util/list.html#iterator()

  • 我是java新手,以前使用过php、python和js。最近使用python,所以要习惯类似“IfMyVar为None:”。这里是我的问题:我从一些库中获取区域设置作为可选的,我只需要返回一种语言,或者如果发生超时,或者一些错误,等等。然后我需要将语言传递给某个对象(上下文),然后在稍后的某处将上下文转换为请求的参数。所以我做了一些类似的事情 我有一个建议,用可选语言重写所有内容。用类似的方法替换

  • 问题内容: 重写的方法可以有不同的返回类型吗? 问题答案: Java支持*协变返回类型的重写方法。这意味着重写的方法可能具有更特定的返回类型。也就是说,只要新的返回类型可分配给你要覆盖的方法的返回类型,就可以使用。 例如: 这在Java语言规范的8.4.5节中指定: 如果返回类型是引用类型,则返回类型在彼此覆盖的方法之间可能会有所不同。返回类型可替换性的概念支持协变返回,即返回类型到子类型的特殊化