【问题标题】:Simplifying conditional statement android简化条件语句android
【发布时间】:2016-11-28 09:59:00
【问题描述】:

我有一个带有少量条件语句的方法。我添加了 if 条件,这样我就可以避免我的 NPE 崩溃。有什么方法可以简化我添加了非空检查的 if 条件?

 private void addComplementaryProductToBasket(String productId, String comboName) {
        Product product = ProductComboUtils.getProductById(productId);
        if (null == product) {
            LOG.info("Product does not exist in ProductComboUtils, fetching from DB");
            product = getProduct(productId);
        }
        if (product != null){
            product.setPrice(BigDecimal.ZERO);
            product.setCurrencyCode(currentBasket.getCurrencyCode());
            // Ensure to add comboName with purchase, this
            currentBasket.addToPurchase(product, comboName);
            int numberOfComplementaryProducts =
                    currentBasket.getPurchaseLineItemForProduct(product.getProductId()).getNumberOfComplementaryProducts();
            currentBasket.getPurchaseLineItemForProduct(product.getProductId()).setNumberOfComplementaryProducts(
                    ++numberOfComplementaryProducts);
        }else
        {
            CrashUtil.logNonFatalException("Product instance is null for productId: " + productId);
        }
    }

【问题讨论】:

  • 你检查了两次相反的东西product == nullproduct != null。 else 和第一个 if 条件相同(product == null
  • @AxelH no ...他再次获得产品
  • 不完全是@AxelH,有一个电话product = getProduct(productId);,所以它有另一个机会为空或不为空。
  • 是否每次都检查产品是否为空?
  • ProductComboUtils.getProductById(productId);和 getProduct(productId);一样吗??

标签: android if-statement simplify


【解决方案1】:

如果要保持先检查ProductComboUtils然后从数据库中获取的逻辑,则无法简化此示例中的 if 条件。

【讨论】:

    【解决方案2】:

    由于您从两个来源获取值,我将简单地创建一个方法来执行检查(Utlis 或 DB)。

    public Product getProductTest(String productId){
        Product product = ProductComboUtils.getProductById(productId);
        if (null == product) {
            LOG.info("Product does not exist in ProductComboUtils, fetching from DB");
            product = getProduct(productId);
        }
        return product;
    }
    

    然后你只需要获取值并检查值。如果这是null 则有问题并且您显示错误。

    private void addComplementaryProductToBasket(String productId, String comboName) {
            Product product = getProductTest(productId);
            if (product != null){
                ....
            } else ...
    }
    

    【讨论】:

    • @Selvin,只需编辑我的答案以更改解决方案,如果您是反对它的人,请再次阅读并告诉我这是否更好。
    【解决方案3】:

    您可以为产品信息/详细信息的可用性保留一个单独的列。

    在您的表格中添加额外的列 isUpdated 并将 0 保留为默认值。

    当您达到足够的要求时,将列值更新为 1

    public void isProdUpdated(int id) {
            SQLiteDatabase db = this.getWritableDatabase();
            try {
            Cursor cursor = db.rawQuery(selectQuery, null); // selectQuery is your complete query 
            if (cursor.getCount() != 0
                    && cursor.moveToFirst()) {
                int status = cursor.getInt(cursor
                        .getColumnIndex(Const.KEY_IS_UPDATED));
                cursor.close();
                return status;
            }
            cursor.close();
        } catch (Exception e) {
            return 0;
        }
        return 0;
        }
    

    例子

    public Product getTestProduct(String productId){
        Product product = null;
        if (ProductComboUtils.isProdUpdated(productId) == 1) {
            return product = ProductComboUtils.getProductById(productId);
        }else{
            LOG.info("Product does not exist in ProductComboUtils, fetching from DB");
            return product = getProduct(productId);
    }
    }
    

    在获取产品信息之前,使用您的主要和检查值调用上述方法。如果返回 1 则继续,否则提示用户无可用信息。

    【讨论】:

    • 那么,我不明白你为什么要在他的表中添加一列来简化条件语句......
    • 我刚刚分享了我的想法。
    • 你不明白。根据我们这里的信息,你是如何结束这个想法的?您能否更具体地说明这将如何提供帮助,我可能只是想念这背后的天才!
    • 我希望这个例子是简化的。有错请指正。
    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多