Java抽象方法中错误检查的最佳实践

时间:2014-09-18 14:03:15

标签: java abstract

我正在学习java,现在我正在学习使用超类。 我有一个抽象方法的超类。当我创建子类时,我必须实现这些方法。问题'是每个实现共享一些代码。 (投掷的例外)。 我想知道是否有更好的方法来编写这段代码?或者这是最好的做法吗?

现在是我的代码:

public abstract class Sugar{
    abstract  calculateprice(int weight);
}


public class LiquidSugar extends Sugar{
    public double  calculateprice(int weight){
        if(weight<0){
            throw new IllegalArgumentException("weight cannot be zero");
        }
        return 'complex formula to calculate price';
    }
}

public class Sugar1 extends Sugar{
    public double  calculateprice(int weight){
        if(weight<0){
            throw new IllegalArgumentException("weight cannot be zero");
        }
        return 'another complex formula to calculate price';
    }
}

public class Sugar2 extends Sugar{
    public double calculateprice(int weight){
        if(weight<0){
            throw new IllegalArgumentException("weight cannot be zero");
        }
        return 'another complex formula to calculate price';
    }
}

我知道我可以像这样在superClass中编写一个方法:

public double calculatePriceSuper(int weight){
    if(weight<0){
        throw new IllegalArgumentException("weight cannot be zero");
    }
    return calculateprice(weight);
}

并在超类&#34;包装器&#34;中进行所有错误检查。方法。但这真的更好吗?

1 个答案:

答案 0 :(得分:4)

将签入拉入自己的方法:

protected void validateWeight( int weight ) {
    if(weight<0){
        throw new IllegalArgumentException("weight cannot be zero");
    }
}

然后你可以像这样重用它

public double calOne modeling mistake that you may be at risk of here is misuse of inheritence. Unfortunately there are many OO tutorials that teach that a bird extends an animal which extends a thculatePriceSuper(int weight){
    validateWeight(weight);
    return calculateprice(weight);
}
  

但这真的更好吗?

当重复的逻辑完全相同时,而不仅仅是间接的,那么这种方法明显更好。它可以减少混乱,并且意味着如果需要对重量进行更改,则只需要在一个地方进行更改。每次代码重复时,我们都会有一个维护的地方和行为分歧的机会。

然而,当共享代码的使用仅在情况上类似时,这可能变得很糟糕。这是可能需要在任何地方都不需要的不同检查的地方。发现差异需要时间和经验,但不要害怕在这里采取行动。


其他

你可能面临风险的一个模拟错误是滥用继承权;这里没有足够的背景供我确定。不幸的是,有许多OO教程教导了一只鸟扩展了一种动物,它扩展了一个东西等等。不幸的是,这在建模时变得非常严格,尤其是在单一的继承语言如Java中。按类型对糖进行子分类听起来像是一个类似的问题。您可能会受益于使用委托,即拥有一个Sugar类,然后使用strategy pattern或类似来增强计算价格的行为。根据您的域模型,类类型甚至可能最好是“产品”,“商品”甚至“可价格”或PriceCalculator。但你是最好的。