2016-05-03 13 views
1

私は単純な問題があります。0より大きく500より小さい重みと名前を持つDogオブジェクトを作成します。しかし、私は有効ではない他のすべてを印刷している間は、どのように入力を無視して入力を無視できるかについて議論しています。これまでのコードです:新しいオブジェクトを作成するときに無効な入力を無視する方法

//Dog dogFail = new Dog("Grimes", 501); is suppposed to be ignored 
public class Dog{ 
    private String name; 
    private double weight; 

    public Dog(String myName, double myWeight){ 
     if(myWeight > 0 && myWeight<500){ 
      name = myName; 
      weight = myWeight; 
     } 
     else{ 
      throw new IllegalArgumentException("Your dog must weigh between 0 and 500 pounds"); 
     } 
    } 

public String toString(){ 
     return "This dog is named " + name + " and weighs " + weight + " pounds"; 
    } 

これについては、どのような方法が最適ですか?

+0

なぜ誰かが無効なオブジェクトを作成できるようにしたいですか?無効なオブジェクトは有害であり、コンストラクタで例外をスローすることは行方です。 –

+0

体重が-5だとすると犬にはどのくらいの体重が必要ですか? – immibis

答えて

1

コードが現在のとおり、toStringステージで誤った出力を無視する必要はありません。コンストラクタで不適切な入力を既に処理して拒否しているためです。

Dog dogFail = new Dog("Grimes", 501);が実行されているとします。その場合、(myWeight > 0 && myWeight<500)はfalseなので、IllegalArgumentExceptionをスローするコンストラクタのelseに行きます。この時点でdogFailが構築されていません。コンストラクタを呼び出すコードが例外をキャッチするか、プログラムがエラーで終了します。

toStringステージで無効な入力を処理したかった場合は、if-else構造体とthrowを取り除いて無効な重みでコンストラクタを使用できるようにすることができます。toString方法:

public Dog(String myName, double myWeight){ 
    name = myName; 
    weight = myWeight; 

} 

public String toString(){ 
    if(myWeight>0 && myWeight<500) { 
     return "This dog is named " + name + " and weighs " + weight + " pounds"; 
    } else { 
     return "This dog is named " + name + " and has an invalid weight entered."; 
    } 
} 
+0

明らかにするために、体重が上がってそのオブジェクトを作成しないで、他のDogに行くという事実を無視する方法はありませんdog dog = new? コードは例外をスローしますが、他の有効なdogオブジェクトは出力しません。 –

+0

@AndrewtheProgrammer私はあなたが望むものを正確には分かりません。重量が無効な場合、デフォルト値に設定しますか?それでは、 'else'の中で' weight = [some value] 'を実行してください。 – hexafraction

+0

明快さの欠如を申し訳ありません - 理想的には、私のコードが無効なエントリを無視し、単にオブジェクトを作成しないようにします。例えば、dogFailと一緒に「Joe」と10ポンドのdog1を作成しようとすると、dogFailは存在しません(その重量は有効ではないため)。dog1は問題なく、後で印刷することができます。 –

0

あなたは例外モデルでやっていることに従うか、単にデフォルト値のいくつかの種類を持っているDogオブジェクトを初期化することができます。すべての子犬が最低の体重を必要とすると仮定すると、体重がコンストラクタまたはgetter/setterを介して "正しく"再割り当てされない限り、すべてのDogインスタンスに最低の体重、たとえば3lbsを割り当てることができます。このようにして、Dogをインスタンス化することはできますが、赤ん坊の犬として使用できます。

多くのユーザーがコンストラクタで例外を使用して対話していますが、視点をコーディングすると合法です。実際には例外をスローするとオブジェクトの初期化に失敗します。あなたのDogオブジェクトのためのバリデータを使用して場所を行うには正しいことではありますが、これを検証するためのクラスを作成することができます。理想的には

public class DogValidator { /* this may extend some abstract validator */ 

public DogValidator() { 
    super(); 
} 

public boolean validatedDog(Dog dog) { /* You can even modify this class to have exclusions e.g. what not to validate (and then use java reflection to invoke methods - may be too advance for what you want to do */ 
    double weight = dog.getWeight(); 

    if(weight > 0 && weight < 500) { 
     return true; 
    } else { 
     return false; 
    } 

} 

} 

、あなたのオブジェクトのデータの健全性と完全性を検証するためにバリデータのこれらの種類を使用しています。上記のクラスはデータ型double/float、犬の色などより厳密な検証を行うように改善することができます

+0

これは基本的に私がやったことと一緒に働くきちんとした方法です。本当にありがとう –

1

コンストラクタで投げて、この特定の状況で私見をはるかに最良の選択肢である、しかし、あなたがあなたのことを、注意することが重要であるnull object pattern

public interface Dog { 
    public void makeSound(); 
} 

public class NormalDog implements Dog { 
    public void makeSound() { 
     System.out.println("woof!"); 
    } 
} 

public class NullDog implements Dog { 
    public void makeSound() { 

    } 
} 

public class FactoryDog { 
    Dog createDog(String name, int weight){ 
     if (isNormalDog(name,weight)) 
      return new NormalDog(name,weight); 
     return new NullDog(); 
    } 
} 

を使用して欲しいものを達成できることは注目に値します無効なオブジェクト(基本的にクラスのコントラクトを破る状態)がこのパターンを使用して浮かんでいるわけではありません。

関連する問題