Archive for outubro, 2012

Precisa-se de APIs de data e hora que funcionem – ou uma resposta a “O eterno problema de calcular a diferença de dias entre duas datas em Java”

segunda-feira, outubro 29th, 2012

Recentemente, o pessoal da Caelum, empresa dos meus amigos Paulo & Guilherme Silveira e mais um monte de gente que admiro, fez um post sobre O eterno problema de calcular a diferença de dias entre duas datas em Java. Leiam, se ainda não o fizeram, senão o resto não fará sentido. O problema é que essas API são bastante deficientes e diria até perigosas.

Eis que o ObjectLabKit eu conheci meio recentemente e já tinha dado uma olhada. Não é uma API feita em cima de imutabilidade, com calendários baseados em nomes apenas e em que os feriados só podem ser setados uma vez – ou seja, num ambiente de classpath compartilhado, i.e. container, a chance de dar zebra é enorme.

O Jollyday é ainda mais perigoso. Além de ser cheio de synchronized pra tudo que é lado, utiliza o perigoso toDateMidnight() no código – que lança exceção no dia em que começa o horário de verão. Além disso, no isHoliday(LocalDate) ele usa o equals() de LocalDate – que compara usando a cronologia, emitindo false para holidayManager.isHoliday(new LocalDate(2012, 1, 1)) – e em outros o Interval.contains(ReadablePartial), que basicamente trabalha com o valor em milissegundos, gerando resultados inconsistentes.

O conceito do LocalDate está quebrado até no joda-time e o Stephen Colebourne, criador da API e que lidera a JSR-310 comigo, já admitiu que a ideia de colocar a cronologia dentro do objeto e todo mundo assumir que não existe cronologia foi um erro de design. É por isso que o LocalDate da JSR não sofre do mesmo mal e é exclusivo para o formato ISO.

Trabalhar com data e hora é tão complicado que o código da JSR já foi refatorado diversas vezes até chegar no estado atual – que espero estar suficientemente bom agora e não padecer do mesmo tipo de problema. Pra isso, precisamos do seu feedback no projeto. Ao testar, leva em conta que poderão haver mais refactorings ainda antes de sua integração no JDK, justamente para evitar problemas do tipo.

Estou trabalhando numa API de cálculo de dias úteis e feriados para uso nos projetos da TecSinapse, empresa na qual estou trabalhando agora, que pretendemos tornar pública se tudo der certo, com implementações em cima do Joda-Time e da JSR-310. Se você tiver interesse em ser um early reviewer e impedir que erros como esse aconteçam na nossa solução também, entre em contato e eu avisarei quando estivermos prontos :-)