3

セッターに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ステートメントをセッターに入れ、コンストラクター内からセッターを使用することです。そうすれば、ロジックを1か所にまとめることができ、保守がはるかに簡単になります。

于 2012-11-02T20:38:17.183 に答える
7

それらをコンストラクターに入れる必要があります。そうしないと、データが無効になる可能性があります。もちろん、コンストラクター内からセッターを呼び出すことで、冗長なコードを回避できます。

それらがコンストラクター内で機能しない理由はthis.quantity = 0;quantity = 0;

コンストラクター内からセッターを呼び出す例:

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ステートメントを配置することは、よく使用されます。これにより、オブジェクトが無効な状態になることはありません。

John3136がコメントで指摘しているように、コンストラクターからセッターを呼び出して、重複するコードの量を減らすことをお勧めします。

コンストラクターの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.

の本体をに変更するifthis.quantity、を削除して、その後はelse常にthis.quantity = quantity割り当てを実行する必要があります。if

設計上の提案:デフォルトで0にするのではなく、数量<0または価格<0を受け取ったときに、IllegalArgumentExceptionをスローすることを検討してください。特定の要件によって異なりますが、-1オブジェクトの請求書を作成することはエラーのようです。

于 2012-11-02T20:36:32.300 に答える
2

。コンストラクター内でも使用する必要があるというヒントを得ました。誰かが私に説明できますか..なぜですか?

コードの重複を回避する可能性が最も高いです。

別の質問:if / elseステートメントをコンストラクターまたはセッター内に配置しますか?

コンストラクターに入れたとしても、それらも必要になりsettersます。

ところで、if/else statements検証です

于 2012-11-02T20:37:57.410 に答える