当前位置: 首页 > 面试题库 >

Java-如何仅创建具有有效属性的对象?

商瀚
2023-03-14
问题内容

我在学习基本的Java课程,但遇到一个问题:仅在将有效参数传递给构造函数后,才如何创建对象?

验证完成后,我应该做一个替代类并从那里调用构造函数吗?

还是应该/应该在类中使用静态方法进行验证?

在这种情况下,最佳做法是什么?


问题答案:

标准做法是验证构造函数中的参数。例如:

class Range {
  private final int low, high;
  Range(int low, int high) {
    if (low > high) throw new IllegalArgumentException("low can't be greater than high");
    this.low = low;
    this.high = high;
  }
}

旁注:要验证参数不为null(这很常见),可以使用:

import static java.util.Objects.requireNonNull;

Constructor(Object o) {
  this.o = requireNonNull(o); //throws a NullPointerException if 'o' is null
}

更新

答复您对社会保险号的特定评论。一种方法是向类添加方法:

//constructor
public YourClass(String ssn) {
  if (!isValidSSN(ssn)) throw new IllegalArgumentException("not a valid SSN: " + ssn);
  this.ssn = ssn;
}

public static boolean isValidSSN(String ssn) {
  //do some validation logic
}

调用代码如下所示:

String ssn = getSsnFromUser();
while(!YourClass.isValidSSN(ssn)) {
  showErrorMessage("Not a valid ssn: " + ssn);
  ssn = getSsnFromUser();
}
//at this point, the SSN is valid:
YourClass yc = new YourClass(ssn);

通过这种设计,您已经实现了两件事:

  • 您可以在使用前验证用户输入(您应该始终这样做-用户非常擅长错别字)
  • 您已确保如果YourClass误用会引发异常,它将帮助您检测错误

您可以通过创建一个SSN包含SSN并封装验证逻辑的类来做进一步的工作。YourClass然后将接受一个SSN对象作为参数,根据构造,该对象始终是有效的SSN。



 类似资料:
  • 问题内容: 用Javascript将是: 但是Python中相同的语法会创建一个字典,那不是我想要的 问题答案: 有两种功能用途。

  • 问题内容: 我是Java的新手,并且开始使用Java 。我想做的是为学生创建一个。每个学生都有与其相关的不同属性()。我试图弄清楚如何使用此属性添加新的学生对象。这是我所拥有的: 问题答案: 您需要的是以下内容:

  • 本文向大家介绍如何让一个对象具有私有属性?相关面试题,主要包含被问及如何让一个对象具有私有属性?时的应答技巧和注意事项,需要的朋友参考一下 Symbol 生成的每个值都是独一无二的 用 Symbol 作 key 值 无论是 for in 或 for of都遍历不到 只能用Object.getOwnPropertySymbols 才可以遍历到

  • 我有一个函数,它将调用外部资源(例如REST)并根据结果返回JSON对象。 例如,如果我发送一个POST并且它可以工作,我需要对象是: 但是当它由于某种原因失败时,我不想要id(因为它将是未定义的)。类似于: 所以只有一个处理方法: 当一切正常时,它会工作,但当它失败时,它会呈现: 有没有办法使“id”成为可选的,这取决于它是否被定义?类似于: 那么在“未定义”中,它将被忽略?我知道我可以只取这个

  • 我试图学习数组对象在Java但不明白。我确实明白如何将输入存储到数组对象中,但不明白如何比较数组中的每个项来做#7和#8。我试图在网上搜索,但从那里卡住了。 > 创建具有以下属性的班级学生:姓名、年龄、地址、电子邮件地址 创建一个空构造函数,用于初始化所有属性的空值。 创建一个接受所有参数并初始化所有属性的构造函数。 为所有属性创建访问器和变异器方法。 创建一个toString方法以返回学生的详细

  • 问题内容: 我只想确认我完全了解CDI起作用的前提条件。如果我有A类: 现在,当我使用以下方法实例化此类时: 在这种情况下,Ab将为空。 但是如果我在另一个类中定义一个成员: 然后使用a,ab将被正确填充? 仅当需要注射的类也是由CDI容器创建的时,CDI才起作用吗?或者,如果使用普通实例化和新实例创建POJO时注入结果为空,那我会丢失什么(是的,我已经安装了beans.xml)? 问题答案: 尽