Вы все еще можете использовать «специализированные» парсеры (как вы предлагали) и объединять их в цепочку: например, у вас все еще могут быть DateHourMinSecParser
(для yyyyMMddHHmmSS
), DateHourMinParser
(для yyyyMMddHHmm
) иDateParser
(для yyyyMMdd
) все они реализуют один и тот же интерфейс:
public interface GenericDateParser {
Date parseDate(String input) throws IllegalArgumentException;
}
например,
public class DateHourMinSecParser implements GenericDateParser {
...
public Date parseDate(String input) throws IllegalArgumentException {
...
}
}
, но каждый из этих классов будет фактически принимать параметр другого GenericDateParser -- идея заключается в том, что каждый синтаксический анализатор сначала попытается проанализировать саму дату, если при синтаксическом анализе (или некоторых внутренних проверках - например, длине строки) он не удастся передать его следующему синтаксическому анализатору в цепочке, пока парсеры не исчезнутцепочка (в этом случае она выдаст исключение, или один из членов цепочки вернет значение):
public class DateHourMinSecParser implements GenericDateParser {
private GenericDateParser chained;
public DateHourMinSecParser(GenericDateParser chained) {
this.chained = chained;
}
public Date parseDate(String input) throws IllegalArgumentException {
if( !internalChecks() ) { //chain it up
if( chained == null ) throw new IllegalArgumentException( "Don't know how to parse " + input);
}
//internal checks passed so try to parse it and return a Date or throw exception
...
}
}
, и вы инициализируете их:
GenericDateParser p = new DateHourMinSecParser( new DateHourMinParser(new DateParser(null)) );
а затем просто используйте верхний уровень один:
Date d = p.parse( '20110126' );