В коде, который вы показываете, проблемы проверки не возвращаются к коду, который создает этот экземпляр объекта. Наверное, это НЕ ХОРОШО.
Вариант 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());
}
}
person
Lee Meador
schedule
28.05.2013
e
в случае API,printStackTrace
пахнет забавно. Конечно, вы должны позволить пользователям кода столкнуться с исключением, чтобы они могли что-то с этим сделать? Вот для чего нужны исключения. - person Grant Thomas   schedule 28.05.2013validateXXX
, чтобы они возвращали логические значения, а затем установить переменную с именемvalid
, если все три вызоваvalidateXXX
допустимы. Затем выставьте эту переменную с помощью методаisValid
- person cmbaxter   schedule 28.05.2013