我有以下代码:
public interface Person {
/***
*@Throws Exception x must be greater than 0 ****/
setAge(int x);
}
public class Man implements Person {
setAge(int x) {
if(x <= 0) thrown new Exception("x <= ");
}
}
我打破了DRY原则,因为我在每个单独的实现中重复检查,文档也重复了它。在这种情况下检查参数的最佳方法是什么?
答案 0 :(得分:1)
鉴于它是一个接口,Java 7及更低版本中的接口不能包含任何实现,那么您已做出设计决策。您是否需要界面的刚性,还是可以使用抽象类?
如果你可以使用这个方法的抽象类,那么我建议这样做,因为它会使你更关心的值实现(和检索)更简单。
public abstract class Person {
protected int age;
public void setAge(int age) {
if(0 > age) {
throw new IllegalArgumentException("Age must be greater than 0");
}
this.age = age;
}
}
通过上述实现,您不会 在子类中实现该方法,并且您不会冒重复自己的风险。
答案 1 :(得分:0)
在Java 8中,您可以使用默认方法
interface Person {
default void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException();
}
// ...
}
}
当实现Person
时,默认方法 not 需要被覆盖,它在抽象类中充当非抽象方法,这可能是您之前需要考虑的事情继续你的设计。
答案 2 :(得分:0)
“检查参数”称为validation。有许多方法可以执行验证。保持DRY这样做并不容易,但这是可能的。这很困难,因为大多数设计都围绕着事情进展顺利的想法,而验证是关于他们何时出错。通常会使您处于验证为cross cutting concern的位置。也就是说,你的设计并不以验证为中心,而是你必须完成的另一件苦差事。
在不必重做设计的情况下实现验证(并保持DRY)的一种方法是使用Aspect Oriented Programming。如果您处于可以用以下规则描述的情况下最有用:“每次调用任何setAge()方法时,我们都需要确保它是正面的”。如果该规则需要在许多不同的类中,这些类不存在于允许您统一它们的任何结构中(例如,通过具有Age类),那么您可能希望查看AOP。