Meu primeiro post: javax.time
Esse é meu primeiro post no blog, que estou inaugurando hoje, 27/05/2009. Espero poder compartilhar o que venho fazendo de interessante e ter tempo suficiente para escrever.
Vou falar aqui sobre o artigo que publiquei na JavaMagazine, edição 69, que deve estar chegando na casa dos assinantes e deve estar nas bancas em breve. O artigo aborda a nova API para representar datas e horas na plataforma Java. Essa nova API está sendo concebida através da JSR 310 e você pode participar do desenvolvimento acessando http://jsr-310.dev.java.net.
Tive o prazer de ter ao meu lado, como co-autor, um dos spec-leads da JSR 310, Michael Nascimento Santos. Clique aqui para acessar seu blog.
O artigo aborda tanto a arquitetura da nova API quanto seu propósito, além de ilustrar a maioria das classes e interfaces disponíveis.
Um dos principais pontos fortes da API é que ela possui como um de seus principais propósitos corrigir uma série de problemas presentes hoje nas classes java.util.Date e java.util.Calendar. Um exemplo disso é o fato da nova API possuir em todas as suas classes a capacidade de suportar múltiplas threads concorrentemente, o que não é suportado pelas opções atuais.
Além disso, a nova API poupa você, desenvolvedor, de uma série de tarefas repetitivas, trabalhosas e propensas a erros na codificação envolvendo datas, horas, períodos e durações. A seguir vemos um trecho onde verificamos se determinado ano é bissexto ou não:
LocalDate hoje = Clock.systemDefaultZone().today();
Year ano = hoje.toYear();
boolean bissexto = ano.isLeap();
Para verificar se um ano é bissexto utilizando java.util.Date você precisaria fazer uma série da cálculos manualmente, pois ao contrário do que se pensa, não basta verificar se o ano é divisível por 4. Já utilizando java.util.GregorianCalendar, temos o método isLeapYear. Estranhamente esse método requer que o ano seja informado como parâmetro ao invés de obter o ano da instância de GregorianCalendar na qual o método executa. Mesmo assim ele não é marcado como static. Ou seja, é bem estranho e pouco intuitivo.
Para calcular a idade de uma pessoa, é outro pesadelo. Aqui vemos como fazer isso utilizando Calendar. Abaixo vemos como é muito mais intuitivo fazer isso utilizando a nova API, onde além da idade em anos, é obtida a diferença completa: P29Y-6M3D.
(assuma que estamos utilizando static imports)
Period nascimento = yearsMonthsDays(1980, 11, 25);
Period hoje = yearsMonthsDays(2009, 5, 28);
System.out.println(hoje.minus(nascimento));
No futuro, poderemos fazer isso de forma ainda mais simples, utilizando a classe Years, algo como Years.between(data1, data2).
Além disso tudo a API cobre uma série de outros pontos interessantes como, por exemplo, as questões de horário de verão. Para conferir isso, recomendo você comprar a revista!