3

当我在 Setters 中只有 if/else 条件时,该程序无法运行。我得到一个提示,我也必须在构造函数中使用它们。有人可以向我解释..为什么?

另一个问题:您是否将 if/else 语句放在构造函数或设置器中?

//构造函数

   public Invoice(String partNumber, String partDescription, int quantity,
        double pricePerItem) {
    super();
    this.partNumber = partNumber;
    this.partDescription = partDescription;

    if (quantity <= 0)
        quantity = 0;
    else
        this.quantity = quantity;

    if (pricePerItem <= 0)
        pricePerItem = 0.0;
    else
        this.pricePerItem = pricePerItem;
}

//二传手

  public void setQuantity(int quantity) {
    if (quantity <= 0)
        this.quantity = 0;
    else
        this.quantity = quantity;
}

public double getPricePerItem() {
    return pricePerItem;
}

public void setPricePerItem(double pricePerItem) {

    if (pricePerItem != 0.0)
        this.pricePerItem = 0.0;

    else
        this.pricePerItem = pricePerItem;
}
4

4 回答 4

8

最好的办法是将 if/else 语句放在 setter 中,并在构造函数中使用 setter。这样你的逻辑就在一个地方,而且更容易维护。

于 2012-11-02T20:38:17.183 回答
7

您需要将它们放在构造函数中,否则数据也可能在那里无效。当然,您可以通过在构造函数中调用设置器来避免冗余代码!

它们在构造函数中不起作用的原因是因为你需要做this.quantity = 0;而不是quantity = 0;

从构造函数中调用 setter 的示例:

public Invoice(String partNumber, String partDescription, int quantity,
               double pricePerItem) {
    super();
    this.partNumber = partNumber;
    this.partDescription = partDescription;

    // call Setter methods from within constructor
    this.setQuantity(quantity);
    this.setPricePerItem(pricePerItem);
}
于 2012-11-02T20:36:52.770 回答
4

将 if/else 语句放在构造函数和 setter 中是有效的,经常使用。它确保对象永远不会处于无效状态。

正如 John3136 在评论中指出的那样,从构造函数中调用 setter 以减少重复代码的数量是一个好主意。

您的构造函数的 if/else 块仍然存在错误。

  if (quantity <= 0)
    quantity = 0;    //  <-- this is setting the parameter passed to 0
else
    this.quantity = quantity;  // <-- this.quantity is only ever set if quantity is > 0.

您将要更改 to 的主体ifthis.quantity删除 theelse并始终this.quantity = quantityif

设计建议:考虑在收到数量 < 0 或价格 < 0 而不是默认为 0 时抛出 IllegalArgumentException。这取决于您的具体要求,但为 -1 对象创建发票似乎应该是一个错误。

于 2012-11-02T20:36:32.300 回答
2

. 我得到一个提示,我也必须在构造函数中使用它们。有人可以向我解释..为什么?

最有可能避免代码重复。

另一个问题:您是否将 if/else 语句放在构造函数或设置器中?

即使你把它放在构造函数中,你也需要它们setters

顺便说一句,if/else statements验证

于 2012-11-02T20:37:57.410 回答