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

尝试/掌握构造函数-推荐做法?

程仲卿
2023-03-14
问题内容

我一直很好奇的东西

public class FileDataValidator {

private String[] lineData;

public FileDataValidator(String[] lineData){

    this.lineData = lineData;
    removeLeadingAndTrailingQuotes();

    try
    {
        validateName();
        validateAge();
        validateTown();
    }
    catch(InvalidFormatException e)
    {
        e.printStackTrace();
    }

}

//validation methods below all throwing InvalidFormatException

不建议在我的构造函数中包含try /
catch块吗?我知道我可以让构造函数将异常抛出给调用方。你们喜欢像我在Constructor中完成的那样调用方法吗?在调用类中,您希望创建FileDataValidator的实例并在该实例上调用该方法吗?只是有兴趣听到一些反馈!


问题答案:

在显示的代码中,验证问题不会传达给正在创建此对象实例的代码。那可能不是一件好事。

变化1:

如果您在方法/构造函数内部捕获到异常,请确保将某些内容传递回调用方。isValid如果所有方法都可以,则可以将字段设置为true。看起来像这样:

private boolean isValid = false;

public FileDataValidator(String[] lineData){

    this.lineData = lineData;
    removeLeadingAndTrailingQuotes();

    try
    {
        validateName();
        validateAge();
        validateTown();
        isValid = true;
    }
    catch(InvalidFormatException e)
    {
        isValid = false;
    }
}

public boolean isValid() {
    return isValid;
}

变体2:

或者,您可以让异常或某些其他异常传播到调用方。我已将其显示为未经检查的异常,但是根据您的异常处理方式,可以执行任何工作:

public FileDataValidator(String[] lineData){

    this.lineData = lineData;
    removeLeadingAndTrailingQuotes();

    try
    {
        validateName();
        validateAge();
        validateTown();
    }
    catch(InvalidFormatException e)
    {
        throw new com.myco.myapp.errors.InvalidDataException(e.getMessage());
    }

}

变体3:

我要提到的第三个方法具有这样的代码。在调用代码中,您必须先调用构造函数,然后再调用有效的build()函数。

String[] lineData = readLineData();
FileDataValidator onePerson = new FileDataValidator();
try {
    onePerson.build(lineData);
} catch (InvalidDataException e) {
    // What to do it its bad?
}

这是类代码:

public FileDataValidator() {
    // maybe you need some code in here, maybe not
}

public void build(String[] lineData){

    this.lineData = lineData;
    removeLeadingAndTrailingQuotes();

    try
    {
        validateName();
        validateAge();
        validateTown();
    }
    catch(InvalidFormatException e)
    {
        throw new com.myco.myapp.errors.InvalidDataException(e.getMessage());
    }

}

当然,该build()函数可以使用isValid()您调用的方法来查看其是否正确,但是对于我来说,对于构建函数而言,异常似乎是正确的方法。

变体4:

我要提到的第四个方法是我最喜欢的方法。它具有这样的代码。在调用代码中,您必须先调用构造函数,然后再调用有效的build()函数。

遵循JaxB和JaxRS的工作方式,这与您所遇到的情况类似。

  1. 外部数据源-您有一个文件,它们有XML或JSON格式的传入消息。
  2. 构建对象的代码-您拥有自己的代码,它们具有各自的代码库,这些代码库根据各种JSR中的规范工作。
  3. 验证不依赖于对象的构建。

调用代码:

String[] lineData = readLineData();
Person onePerson = new Person();
FileDataUtilities util = new FileDataUtilities();
try {
    util.build(onePerson, lineData);
    util.validate(onePerson);
} catch (InvalidDataException e) {
    // What to do it its bad?
}

这是数据所在的类代码:

public class Person {
    private Name name;
    private Age age;
    private Town town;
... lots more stuff here ...
}

以及用于构建和验证的实用程序代码:

public FileDataValidator() {
    // maybe you need some code in here, maybe not
}

public void build(Person person, String[] lineData){

    this.lineData = lineData;
    removeLeadingAndTrailingQuotes();
    setNameFromData(person);
    setAgeFromData(person);
    setTownFromData(person);
}

public boolean validate(Person person) {

    try
    {
        validateName(person);
        validateAge(person);
        validateTown(person);
        return true;
    }
    catch(InvalidFormatException e)
    {
        throw new com.myco.myapp.errors.InvalidDataException(e.getMessage());
    }

}


 类似资料:
  • 问题内容: java中的clone方法vs复制构造函数。哪个是正确的解决方案。每种情况在哪里使用? 问题答案: 克隆已损坏,因此请勿使用。 Object类的CLONE方法是一种有些神奇的方法,它没有纯Java方法可以做的事情:它产生其对象的相同副本。自Java编译器的Beta版本发布以来,它就已经存在于原始Object超类中。就像所有古代魔法一样,它需要适当的咒语以防止该法术意外地反射击 首选复制

  • 问题内容: 据我所知,一个唯一可以做的事和一个不能做的事就是打电话给。 由于我们尚未调用,因此in 会在进入第一遍之前准备状态对象。本质上是相同的: 但是我看到了另一个有用的用例(在服务器端)。 让我们考虑一些异步的东西: 在这里,我们不能使用as分配来不会触发。 怎么样的?根据React docs : 在挂载发生之前立即调用。在之前调用),因此在此方法中设置状态不会触发重新渲染。避免在此方法中引

  • 本文向大家介绍完全掌握C++编程中构造函数使用的超级学习教程,包括了完全掌握C++编程中构造函数使用的超级学习教程的使用技巧和注意事项,需要的朋友参考一下 构造函数是一种可初始化其类的实例的成员函数。构造函数具有与类相同的名称,没有返回值。构造函数可以具有任意数量的参数,类可以具有任意数量的重载构造函数。构造函数可以具有任何可访问性(公共、受保护或私有)。如果未定义任何构造函数,则编译器会生成不采

  • 本文向大家介绍轻松掌握Java建造者模式,包括了轻松掌握Java建造者模式的使用技巧和注意事项,需要的朋友参考一下 建造者模式针对的是复杂对象的构建,比如一个产品有多个部分构成,每个部分都可以单独进行生产,这时候就可以用建造者模式,由Builder构造产品的每个部分,然后又director完成最后产品的组装。 特点:     1、分工更加明确,组建和构造分开,能更好的控制产品的生产。     2、

  • 问题内容: 鉴于Main.java: 结果为: 0 4. 但是,如果a.print输出引用A类,为什么为什么不输出“ A”呢?我怎么知道在这种情况下何时调用一种方法?为什么要调用A的构造函数而仍然使用B的方法? 问题答案: 由于多态性而调用打印。调用的方法取决于的运行时类型,即。何时调用无关紧要;多态总是适用。 两次都调用的方法。一次来自的构造函数,由中的默认构造函数调用。另外一次是您显式致电。

  • 例如,我有一个这样的课; 我要做的是为模拟的构造函数编写单元测试。 如果是静态的,那么这将很容易,因为我可以使用然后调用构造函数。 有人知道有什么办法吗?