代码之家  ›  专栏  ›  技术社区  ›  Dean J

空指针无处不在,因为数据突然变得稀疏

  •  4
  • Dean J  · 技术社区  · 16 年前

    有100多行这样的代码:

    functionDoSomething(foo, bar, getRoot().getChild("1").getChild("A").
        getChild("oo").getContent());
    

    作为另一个转折点,与getChild()不同,实际上有四个单独的方法,它们只能按特定顺序出现。有人建议打一个Varags电话,这不是个坏主意,但不会像我希望的那样干净。

    清理这个最快的方法是什么?最好的?每一条线都有人建议“尝试/抓住”,但伙计,这太难看了。将上述方法的第三个参数分解为它自己的函数可能会起作用。。。但这将需要100多种新方法,这让人感觉很难看,尽管不那么难看。

    思想?

    实际上,getChild()是一个方便的方法。我想到的最简洁的方法是让便利方法返回一个有效的子对象,但让“空”子对象的getContent()始终返回“”。

    6 回复  |  直到 14 年前
        1
  •  9
  •   Kevin Bourrillion Gergely    16 年前

    请考虑使用XPath代替这种混乱。

        2
  •  8
  •   Kathy Van Stone    16 年前

    您所描述的(返回一个特殊的子对象)是 NullObject 模式,这可能是这里最好的解决方案。

        3
  •  2
  •   True Soft    16 年前

    解决方案是对XML使用DTD文件。它验证您的XML文件,以便 getChild("A") 当A是必需的时,不会返回null。

        4
  •  2
  •   Robert Munteanu    16 年前

    private Content getChildContent(Node root, String... path) {
        Node target = root;
        for ( String pathElement : path ) {
             Node child = target.getChild(pathElement);
             if ( child == null ) 
                return null; // or whatever you should do
    
             target = child;
        }
    
        return target.getContent();
    
    }
    

    用作

    functionDoSomething(foo, bar, getChildContent(root, "1", "A", "oo"));
    
        5
  •  2
  •   Thomas Jung    16 年前

    您的问题可能是设计问题: Law of Demeter .

    如果没有,你可以使用类似 Option type 将getChild的返回类型更改为Option<节点>:

    for(Node r : getRoot())
      for(Node c1 : r.getChild("1"))
        for(Node c2: c1.getChild("A"))
          return c2.getChild("oo")
    

    这是因为选项实现了Iterable,当未定义返回值时,它将中止。这与Scala类似,Scala可以用一个for表达式来表示。

    永远不要返回空值 . 使用选项类型,您可以在接口定义中声明返回值可能未定义,并且客户机可以决定如何处理。


        6
  •  0
  •   Malaxeur    16 年前

    如果它总是深入到大致相同的级别,那么您可能可以使用Eclipse重构代码,例如,它会自动更改看起来相同的每一行。