代码之家  ›  专栏  ›  技术社区  ›  JRL

关于NPE和单行上多个表达式的最佳实践

  •  2
  • JRL  · 技术社区  · 14 年前

    anObj.doThatWith(myObj.getThis());
    

    Object o = myObj.getThis();
    anObj.doThatWith(o);
    

    后者更冗长,但如果有一个NPE,你马上就知道是什么了 null

    所以我的问题是:

    • 四处设计?去是不是更好
    • 变量名的创建是否会对性能产生影响?
    • 信息能够决定什么 对象是 无效的 在以后的版本中
    5 回复  |  直到 14 年前
        1
  •  2
  •   rsp    14 年前

    如果你确定 getThis() null 值,第一个变量就可以了。您可以在代码中使用契约注释来检查这些条件。例如,Parasoft JTest使用如下注释 @post $result != null 并标记所有不带注释的方法,这些方法使用返回值而不进行检查。

    如果方法可以返回 无效的 只有你能决定 如果返回值为 无效的 ,这可能是正常的,或者您可能希望记录一个错误:

    Object o = getThis();
    
    if (null == o) {
        log.error("mymethod: Could not retrieve this");
    } else {
        o.doThat();
    }
    
        2
  •  5
  •   Stephen C    14 年前

    这个问题值得设计吗?选择第一种还是第二种可能性更好?

    依我看,不是的。去看看最重要的代码版本吧 可读的 .

    如果你得了不能诊断的NPE 然后

    变量名的创建是否会对性能产生影响?

    是否建议更改异常消息,以便在将来的Java版本中确定哪个对象为null?

        3
  •  3
  •   SLaks    14 年前
        4
  •  0
  •   RonK    14 年前

    就我个人而言,我不喜欢一行代码“设计模式”,所以我站在所有那些说保持代码可读性的人一边。尽管我在现有项目中看到了更糟糕的代码行,类似于:

    someMap.put(
         someObject.getSomeThing().getSomeOtherThing().getKey(),
         someObject.getSomeThing().getSomeOtherThing()) 
    

    我认为没有人会说这不是编写可维护代码的方法。

    @可为空的 @不为空 注释。如果没有IDE集成,这些就没有什么好处(除了一些额外的文档)。不过,我还是推荐 assert

        5
  •  0
  •   Ian Dallas    14 年前

    如果是我,我会把代码改成你的后一个版本,但是我也会用log4j这样的框架添加日志(可能是打印)语句,这样如果出了问题,我就可以检查日志文件,看看什么是空的。