Java 如何在不破坏DRY原则的情况下从接口检查方法中的参数

Java 如何在不破坏DRY原则的情况下从接口检查方法中的参数,java,interface,dry,defensive-programming,Java,Interface,Dry,Defensive Programming,我有以下代码: 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 <= "); } } 公共接口人{ /*

我有以下代码:

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 <= ");
    }
}
公共接口人{
/***
*@抛出异常x必须大于0****/
设置(INTX);
}
公共类人实现人{
设置(整数x){

如果(x假设它是一个接口,而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;
    }
}

通过上述实现,您不必在子类中实现该方法,也不会冒重复的风险。

在Java 8中,您可以使用默认方法

interface Person {

    default void setAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException();
        }
        // ...
    }

}
接口人{
默认无效设置(整数年龄){
如果(年龄<0){
抛出新的IllegalArgumentException();
}
// ...
}
}

当“代码>人<代码>实现时,默认方法不需要重写,它作为抽象类中的非抽象方法,这可能是您继续设计之前需要考虑的问题。

< P>检查参数”被称为。有许多执行验证的方法。在这样做的时候留下来并不容易,但这是可能的。这很困难,因为大多数设计都围绕着事情进展顺利的想法进行,而验证则围绕着事情出错的时间。通常这会让你处于验证是一个关键的位置。也就是说,你的设计不会围绕着你nd验证,这只是您必须执行的另一项杂务


实现验证(并保持干燥)而不必重做设计的一种方法是使用。如果您处于一种可以用规则描述的情况,例如:“每次调用任何setAge()方法时,我们都需要确保它是积极的”.如果这条规则需要适用于许多不同的阶层,而这些阶层并不存在于任何允许你统一他们的结构中(比如说,有一个年龄阶层)然后你可能会想研究一下。

虽然我确信这不是问题的重点,但我不得不指出,存储年龄很少是个好主意,因为它会随着时间的推移而变化。最好是存储出生日期并在每次读取时计算年龄。你是对的,但我觉得这是错误的。默认方法实际上是为了支持功能接口,因为在功能接口中只能有一个没有实现的方法。我的直觉是使用抽象类,因为它传达的意图更清晰(如果这是接口中唯一的方法,那么将其作为接口没有多大好处)。