在显示的代码中,验证问题不会传达给正在创建此对象实例的代码。那可能不是一件好事。
变化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 pre 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的工作方式,这与您所遇到的情况类似。
- 外部数据源-您有一个文件,它们有XML或JSON格式的传入消息。
- 构建对象的代码-您拥有自己的代码,它们具有各自的代码库,这些代码库根据各种JSR中的规范工作。
- 验证不依赖于对象的构建。
调用代码:
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 pre 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()); }}


