在您显示的代码中,验证问题不会传达回创建此对象实例的代码。这可能不是一件好事。
变体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 的工作方式,这与您所拥有的情况类似。
- 外部数据源 - 您有一个文件,它们有 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 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());
}
}