简单的工厂 - 检查数据的正确性

时间:2017-04-15 13:08:48

标签: java

我有Month类,其中包含一些数据,例如。 numbernumber of days等我想简单地创建这个类实例。我决定创建包含月份数据并返回就绪对象的简单工厂。我的问题是在哪里检查数据的正确性,例如。 1月有31天,还有其他几天...... Month班级应该检查数据是否正确或Factory应该对此负责吗? (在这种情况下,我们可以使用无效数据创建Month对象)...

3 个答案:

答案 0 :(得分:1)

请不要重新发明日历课程!有人已经为你做了。查看Joda-Time或Java 8包java.time。这是了解如何设计像Month这样的类的好起点。

日期的概念不应混合在一个类中。因为一个月有多少天取决于年份和日历系统。当您从日期创建日期时,应该验证无效天数 的。所以它是 date 对象构建过程的一部分。

这看起来很奇怪:

Month january = Month.newMonth(31);

Month创建int对象的工厂方法应检查参数是否在1(1月)到12(12月)的范围内,并返回表示具体月份的枚举。

这就是我所期望的:

Month january = Month.newMonth(1);

答案 1 :(得分:0)

您的月份课程应该自行检查。拥有仅依赖于类本身中的类的逻辑始终是最佳实践。否则,如果其他人使用您的应用程序并在不使用工厂的情况下实例化Month对象,它将起作用,但它不会像您设计者所期望的那样。

你可以随意处理一个错误,但我会在构造函数中执行它,然后如果有人尝试用无效参数实例化它会抛出错误。

答案 2 :(得分:0)

您应该在构造函数中传递参数之前验证参数。

但是,如果输入是动态的而不是您完成的,静态工厂方法可能不是验证输入的最佳位置。

如果您只是想确保编译器在使用无效参数时发出警告,您可以抛出一个检查过的异常,如下所示:

public static final Month newMonth(int numberOfDays) {
if(numberOfDays > 31 || numberOfDays < 28) {
throw new IllegalArgumentException("invalid numberOfDays");
}
return new Month(numberOfDays);
}

无论哪种方式,在我看来,你不应该去尝试...捕获方式或使构造函数验证任何东西,因为它会使你的代码的可读性低很多,如果你改变你的验证也会破坏很多其他代码方法