在现有的xmlbeans Java代码库中处理嵌套空值检查的实用方法?

时间:2016-03-16 16:51:34

标签: java nullpointerexception xmlbeans

这是一个很常见的问题,但我需要说的是,您提出的这个问题与包含适合我们情况的解决方案并不重复。

在工作中,我们在一个8岁的代码库上使用xmlbeans,并巧妙地说它没有得到很好的处理。当然,真正的解决方案是我们不应该使用null作为信息(并且可能根本不使用xmlbeans),但我正在研究处理以下问题的最不可靠的方法:

如果我们有一个Person的实体,它可以选择性地拥有Wallet的子实体,它可以选择包含WalletItems的子实体,可以选择具有可以拥有CardNumber的Card的子实体,这是什么最实用的方法。检查一个人是否至少有一个CardNumber?

我们有三个有效的解决方案,以及团队应该坚持的论点:

isCardHolder(Person person){
    if (person != null && person.getWallet != null && 
        person.getWallet.getWalletItems != null &&
        person.getWallet.getWalletItems.get(0) != null && // Just a dirty example, don't worry here
        person.getWallet.getWalletItems.get(0).getCard != null &&
        person.getWallet.getWalletItems.get(0).getCard.getCardNumber != null){
        return true;
    } else {
        return false;
}

或者:

isCardHolder(Person person){
    Wallet wallet = (Person != null ? person.getWallet : null);
    WalletItems[] walletItems = (wallet != null ? wallet.getWalletItems : null);
    // etc etc
    if (card.getCardNumber != null) {
        return true;
    } else {
        return false;
    }
}

甚至:

isCardHolder(Person person){
    try {
        if (person.getWallet.getWalletItems.get(0).getCard.getCardNumber != null){
            return true;
        }
    } finally {
        return false;
    }
}

我个人的偏好是将其烧掉并重新开始,或至少放弃xmlbeans,以便我们可以使用Null Object模式或标准问题中的任何其他内容on this topic但我们会卡住现在用它来取决于它。

1 个答案:

答案 0 :(得分:1)

Robert C. Martin的一些引言"清洁代码"关于功能。

  

功能的第一条规则是它们应该很小。

     

函数应该做某事,或回答某些事情,但不能同时回答。

恕我直言,这样做的最佳方式可能是:

    package com.example.sampl;

    public class MainSampl {



        public static void main(String[] args) {
            Person p = new Person();
            boolean correct = isCorrect(p);
            System.out.println(correct);
        }

        private static boolean isCorrect(Person person){
            return  isNotNull(person) &&
                    isNotNull(person.getWallet()) &&
                    isNotNull(person.getWallet().getWalletItems()) &&
                        isNotNull(person.getWallet().getWalletItems().getItems().get(0));
//etc
        }

        private static boolean isNotNull(Object data) {
            return data != null;
        }

    }

所以我认为我的isNotNull函数正在回答参数是否正常然后isCorrect函数回答所有优先检查对象是否正常。你的职能:

  1. 检查对象是否为空并回答是否正常。这两件事情都是如此
  2. 第二个与第一个相同,我认为是 对我来说非常难以理解。所以不可读并做两件事。
  3. 第三个相同。它做了两件事 回答并做某事太久了。
  4. 关于使用逻辑运算符。我认为如果你的代码中的逻辑运算符较少,那么对于将来的重构更好,并且通常更好地阅读它,因为

      

    如果你想要快速,如果你想快速完成,如果你想   您的代码易于编写,易于阅读

相关问题