【发布时间】:2018-08-26 08:47:55
【问题描述】:
假设我们使用 Java SE(没有库)并且有以下情况。我们有一堂课:
public class DriverInfo {
private final int age;
public DriverInfo(int age) {
this.age = age;
}
// getter here
}
在某些国家/地区,您必须年满 18 岁才能开车。换句话说 - 我们需要对 age 参数进行一些验证。比如:
if (age < 18) {
throw new IllegalArgumentException("Age is not valid!");
}
所以,我的问题是 - 这个验证应该在哪里?我的想法如下:
- 在构造函数中添加上述 if()。如果从代码的多个位置调用构造函数,则验证将起作用。我担心的是类构造函数(恕我直言)不应该包含任何逻辑。我说的对吗?
- 验证构造函数之外的某个地方 - 无论是工厂方法、构建器类等。但是我们迫使开发人员不要使用构造器来实例化类,而是使用一些人工工厂/构建器。
- 使用Validate 验证构造函数参数。它不是标准的 Java,但我看到有人这样做。对我来说,它看起来不正确,因为我们正在向构造函数添加逻辑 - 这看起来不适合我。
- 我错过了任何其他好方法吗?
任何想法将不胜感激。有没有人可以提出一个最佳实践来处理所描述的住所情况?
【问题讨论】:
-
你应该在将值传递给构造函数之前检查年龄。
-
在构造函数中抛出异常完全没问题。但在这样做之前,您应该释放获得的资源,例如关闭流。
-
对此有太多不同的方法。根据您运行此代码的方式、您使用的框架,您将获得不同的标准实践。 Web 框架、Java EE 等都为您提供了执行此操作的方法,甚至不需要输入
if条件。您知道您的验证,您正在寻找的是为您的平台/框架进行验证的适当方法。如果您的“框架”没有标准方法,那么您的建议就是完美的(硬编码部分除外) -
通过在构造函数中进行验证并在无法以有效状态构造对象时抛出异常来确保所有对象都在有效状态下构造。在构造函数中包含逻辑非常好,并且在 Java API 和第三方库中的许多类中都完成了。例如FileReader constructors 读取文件系统以搜索文件并确保文件可读然后打开它。否则他们会抛出异常。
标签: java validation