0

我有以下代码:

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 原则,因为我在每个实现中都重复了检查,并且文档也重复了它。在这种情况下检查论点的最佳方法是什么?

4

3 回答 3

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

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

于 2014-11-30T06:36:47.690 回答
0

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

interface Person {

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

}

实现时,不需要Person重写默认方法,它充当抽象类中的非抽象方法,这可能是您在继续设计之前需要考虑的事情。

于 2014-11-30T07:14:29.033 回答
0

“检查参数”称为验证。有许多执行验证的方法。在这样做的同时保持干燥并不容易,但这是可能的。这很困难,因为大多数设计都围绕着事情进展顺利的想法,而验证是关于他们何时出错。通常这会使您处于验证是一个跨领域关注点的位置。也就是说,您的设计不以验证为中心,它只是您必须执行的另一项苦差事。

无需重做设计即可实现验证(并保持 DRY)的一种方法是使用Aspect Oriented Programming。如果您处于可以用以下规则描述的情况,则它最有用:“每次调用任何 setAge() 方法时,我们都需要确保它是肯定的”。如果该规则需要在许多不同的类上,这些类不存在于任何允许您统一它们的结构中(例如,通过拥有一个 Age 类),那么您可能需要研究AOP

于 2014-11-30T07:16:07.733 回答