java - 如何在 Java 上验证构造函数参数?

标签 java validation

假设我们使用 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/

相关文章:

java - 我们应该向 userFriendlySelector 函数传递哪些参数才能获取流信息

Java:线程池的递归线程创建 -> 如何检测完成

javascript - 如何处理两个javascript事件?

ruby-on-rails - 如何跳过 has_secure_password 验证

java - 自动管理Java对象

java - Java推荐算法

validation - 如何正确使用 Core Data 验证和错误框架?

ruby-on-rails - 检查模型中不存在的字段的形式

java - 如何从谷歌应用程序调用.Net网络服务?

iphone - 验证/检查 iPhone 上是否已安装配置文件