假设我们使用 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,但我看到有人这样做。对我来说,它看起来不对,因为我们正在向构造函数添加逻辑 - 这对我来说不对。
- 还有其他我错过的好方法吗?
如有任何想法,我们将不胜感激。有没有人可以建议如何处理所描述情况的最佳做法?
最佳答案
构造函数中的验证完全没问题。这个“构造函数中没有逻辑”规则不适用于它,不幸的是,我猜它的措辞有点。 构造函数的任务是从外部获取依赖项(依赖注入(inject)),确保它们有效,然后可能将它们存储在实例属性中——简而言之,创建有效实例。
这样,什么是有效的什么是无效的规则被保存在对象中,而不是在一些工厂中分离。
如果实例无效,那么抛出一个解释参数错误的异常是绝对没问题的。它可以防止无效实例在系统中漫游。
同样,通过这种方式,对于不可变对象(immutable对象),您可以保证所有现有实例始终有效,这很棒。
在对象上使用一些验证方法是可能的并且很有用,但我更喜欢构造函数验证。但如果不可能,那总比没有好,它仍然保持对象内的有效性规则。就像当某些框架为您构建可变对象并需要无参数构造函数时……您可能会忘记调用它,但总比没有好。
关于java - 如何在 Java 上验证构造函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49335072/