我有一个简单的问题 - 创建一个权重大于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 :(得分: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等。