我应该在验证构造函数的参数?(Should i validate parameters in con

2019-08-17 07:11发布

我创建了MVC模式下的Web应用程序。

在有效的Java作者提到创建一个新的对象时,以验证在类的构造函数的参数。

但是我不是创造一些API将被第三方使用。 我的班只接受从beeing submited到服务器之前进行验证一个表单的输入域参数。

因此,在这种情况下,我要创造我的课,笔者在有效的Java提到的方式或者是没用的?

Answer 1:

它不是那么明朗阅读书籍和实现它说什么。 你需要考虑和运用所学知识您的具体情况。

这真的取决于你如何在初始化类的变量和对象的构造之后,立刻使用它们:

一些指针:

  • 如果这些变量将要通过一些方法在课堂上使用或对象将被重新使用结构之后(在大多数情况下),你应该验证所需的值不为空或null,为了避免让讨厌的例外。

  • 验证输入参数,第二次是当你想到正确的值设置为特定的内部变量。 如果你需要一个参数被限制在一个特定的值范围,那么你验证是非常重要的。

例:

假设我们有物体的工资帽:

int salary = 0;
int salaryCap = 1000;

在创建过程中,你可以验证在工资总额中传递:

public Employee(int salary) {
 if(salary >= this.salaryCap)
  this.salary = salary;
}
  • 阶级关系也决定了你是否要验证值与否。 如果这些参数将被传递弥补,例如继承链,我想借此来验证他们的时候,尤其是当它们会影响继承链中的其他对象的状态。

例:

每当我不得不调用超构造函数,我忍不住要验证输入:

public Employee(int salary) {
 super(salary); //validate salary against known constraints
}
  • 哪里有变数来自哪里? 如果你不信任源(如SQL参数等),那么你就应该对其进行验证和执行进一步的代码之前可能净化输入。 这可以防止安全攻击。

  • 我总是厌倦做验证和参数检查在构造函数中。 我宁愿有getter和setter方法来验证输入。 这样一来,如果事情发生在创建对象,至少我有半加工对象物不是完全不一致的对象,它的状态不能很容易地确定保障。 当然,这取决于你的背景下,如果你的约束严格,你可以停止对象的创建,并提示客户端(用户,调用对象等)的有效输入参数。

当使用getter / setter方法得到我的优点是,该目的是通过调用该外部接口的对象给出,不是限制创建期间的验证,其中,当发生异常时,使该对象不能使用/不稳定的其他真构造步步。

因此,而不是这样的:

public Employee(int salary) {
 if(salary >= this.salaryCap)
  this.salary = salary;
}

我喜欢这样的:

public class Employee {
 public void setSalary(int salary) {
  if(salary >= this.salaryCap)
      this.salary = salary;
 }
}

后者给了我的能力与有效的异常给调用者,这将不会影响对象创建(我不喜欢在构造函数抛出异常)完全退出。

概括地说,做你的变量有限制? 如果是,将它们设置为内部数据属性之前验证这些约束。



Answer 2:

I would suggest validating the data in your domain and returning a (custom) exception when fields aren't filled in correctly. This way you'll be able to implement a different UI without having to do the entire validating process again, it's best to separate this as much as possible.



Answer 3:

在第一次看到它是没有必要的验证参数,因为验证了之前完成。 但是你要考虑到你的类将在其他情况下使用,则无法确保您的每一次构造函数的输入是有效的。



Answer 4:

这听起来像您要验证这之前已经验证的领域。 在这种情况下,它只是在浪费时间(包括写它在运行时)。 如果您的形式(客户端JavaScript)没有验证领域那就意义。 否则,你可以跳过它。



文章来源: Should i validate parameters in constructor?