2016-05-03 101 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)是錯誤的,所以我們在構造函數中轉到else,該構造函數拋出IllegalArgumentException。此時,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

因此,澄清,沒有辦法忽略的重量超過,而不是創建該對象,去其他一些狗dogNext =新等事實? 就目前而言,代碼會拋出異常,但不會打印出其他有效的狗對象。 –

+0

@AndrewtheProgrammer我不確定你想要什麼。如果重量無效,您想要將重量設置爲某個默認值嗎?然後在'else'中做'weight = [some value]'。 – hexafraction

+0

對不起,缺乏清晰度 - 理想情況下,我希望我的代碼忽略無效條目,而不是創建一個對象。例如,如果我試圖用「Joe」創建dog1並與dogFail一起創建10磅,則dogFail將不存在(因爲它的重量無效),但dog1會很好並可以稍後打印出來等。 –

0

您可以跟着你有異常模型做了什麼或只是初始化Dog對象有某種默認值。假設所有的小狗都有最低的體重要求,您可以爲每個Dog實例分配一個最小體重,例如3磅,除非它們的重量通過構造函數或getter/setter被「正確」重新分配。這樣,你仍然可以實例化一個Dog,但作爲一隻小狗。如果你拋出一個異常(例如,你的對象初始化失敗了,它已經準備好用於GC了),你已經提出了一個場景其中,使用驗證您的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(); 
    } 
} 

重要的是要注意,你沒有無效的對象(基本上是一個打破你班級合同的狀態),並且使用這種模式。

相關問題