Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在创建新对象时忽略无效输入?_Java - Fatal编程技术网

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

Java 如何在创建新对象时忽略无效输入?,java,Java,我有一个简单的问题-创建一个重量大于0小于500的狗对象和一个名称。然而,我正在讨论如何在打印所有其他有效内容时忽略无效的输入。这是我目前的代码: //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 m

我有一个简单的问题-创建一个重量大于0小于500的狗对象和一个名称。然而,我正在讨论如何在打印所有其他有效内容时忽略无效的输入。这是我目前的代码:

//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";
    }
//dogdogfail=新狗(“格里姆斯”,501);不建议忽略
公家犬{
私有字符串名称;
私人双倍重量;
公犬(字符串myName,双倍myWeight){

如果(myWeight>0&&myWeight与代码当前的状态相同,则不需要在
toString
阶段忽略不正确的输出,因为您已经在构造函数中处理并拒绝了不正确的输入


假设运行了
dogdogfail=newdog(“Grimes”,501);
(myWeight>0&&myWeight您可以按照您对异常模型所做的操作,或者简单地初始化
Dog
对象以获得某种默认值。假设所有小狗都有最低体重要求,您可以为每个
实例分配一个最低体重,例如,3磅,除非重新分配它们的体重d通过构造函数或getter/setter“正确地”。通过这种方式,您仍然可以实例化
,但可以将其作为幼犬

很多用户可能会反对在构造函数中使用异常,但从编码的角度来看,这是合法的——事实上,如果抛出异常(也就是说,如果对象初始化失败,就可以进行GC了。您已经介绍了一个场景,在该场景中,为
对象使用验证器是正确的。您可以编写一个类来验证:

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;
    }

}

}
公共类DogValidator{/*这可以扩展一些抽象验证器*/
公共验证程序(){
超级();
}
public boolean validatedlog(Dog Dog){/*您甚至可以修改该类以包含排除项,例如,不验证的内容(然后使用java反射调用方法),这对于您想要做的事情来说可能太超前了*/
双倍重量=dog.getWeight();
如果(重量>0和重量<500){
返回true;
}否则{
返回false;
}
}
}

理想情况下,您可以使用这些类型的验证器来验证对象的数据健全性和完整性。可以对上面的类进行改进,使其具有更严格的验证,例如数据类型double/float、dog colors等。

IMHO在这种特定情况下,加入构造函数是迄今为止最好的选择,但是,值得注意的是你可以使用


需要注意的是,您没有无效对象(基本上是一种破坏类契约的状态)使用这种模式四处游荡。

为什么你想允许某人创建一个无效对象?无效对象是有毒的,在构造函数中抛出异常是一种方法。如果你说重量为-5,狗应该有多大的重量?因此,澄清一下,没有办法忽略这个事实,即重量超过了,而不创建那个object,转到其他狗DONGNEXT=new等?目前,代码抛出异常,但它不会打印出其他有效的狗对象。@AndrewtheProgrammer我不确定您到底想要什么。如果权重无效,是否希望将其设置为某个默认值?然后只需执行
weight=[某个值]
的else
中。很抱歉不够清晰-理想情况下,我希望我的代码忽略无效条目,而不创建对象。例如,如果我试图创建带有“Joe”和10磅的dogFail的dog1,dogFail将不存在(因为它的重量无效),但是dog1可以,以后可以打印出来,等等。@AndrewtheProgrammer它不会创建对象,因为你抛出了异常。请编辑你的原始问题,以显示你是如何准确调用构造函数的。我正在编辑OP,它告诉我如何解决这个问题。干杯,谢谢你的帮助!这是一种巧妙的工作方式这就是我所做的,非常感谢
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;
    }

}

}
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();
    }
}