如何在创建新对象时忽略无效输入?

时间:2016-05-03 22:50:16

标签: java

我有一个简单的问题 - 创建一个权重大于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";
    }

最好的方法是什么?

3 个答案:

答案 0 :(得分:1)

正如您的代码当前所示,您不需要在toString阶段忽略不正确的输出,因为您已经处理并拒绝了构造函数中的错误输入。

想象一下Dog dogFail = new Dog("Grimes", 501);正在运行。在这种情况下,(myWeight > 0 && myWeight<500)为false,因此我们转到构造函数中的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.";
    }
}

答案 1 :(得分: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();
    }
}

重要的是要注意,您没有使用此模式浮动的无效对象(基本上是破坏您的类合同的状态)。

答案 2 :(得分:0)

您可以按照自己对异常模型所做的操作,或者只是初始化Dog对象以获得某种默认值。假设所有幼犬都具有最小重量要求,您可以为每个Dog实例分配最小重量,例如3磅,除非重新分配它们的重量&#34;正确&#34;通过构造函数或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,dog colors等。

相关问题