Quem já precisou criar uma aplicação de e-commerce, por exemplo, já notou que as técnicas disponíveis no momento sempre nos levam a problemas difíceis de serem superados ou a um grande trabalho manual de codificação de classes próprias que visam manipular esses valores de forma satisfatória.
É neste cenário que surge a Money API, solução que visa facilitar enormemente esta tarefa, trazendo uma API simples e intuitiva de ser usada.
Embora seu lançamento esteja previsto apenas na nona versão do Java, desde já podemos usá-la e nos antecipar a estas mudanças, pois a JSR e sua implementação de referência já estão disponíveis.
Após ler este artigo e entender como esta API vai facilitar substancialmente sua vida, não temos dúvidas que você irá baixá-la agora mesmo e começar a utilizá-la em seu próximo projeto!
Você já precisou criar uma aplicação na qual existe a necessidade de manipulação de valores monetários? Dois bons exemplos de aplicações deste tipo são os e-commerce e sistemas de frente de loja, nos quais precisamos constantemente somar, subtrair, dividir e multiplicar valores em dinheiro, sem contar a necessidade de converter valores de real para outra moeda. Para dificultar um pouco mais, precisamos também imprimir esses valores de forma amigável para o usuário.
Caso ainda não o tenha feito, pergunte para quem já precisou desenvolver estes tipos de sistemas e a resposta provavelmente será que o Java deveria fornecer uma forma mais simples e elegante de tratar valores monetários.
Embora aparente ser um problema simples, existem diversos aspectos com os quais devemos nos preocupar e que nos sobrecarregam.
Atualmente, a prática mais comum entre os desenvolvedores consiste em criar um campo do tipo Double, Float ou BigDecimal para armazenar estes valores.
Contudo, como veremos no decorrer deste artigo, estas não são práticas recomendáveis, assim como também não é aconselhável utilizar os tipos int e long para esta tarefa.
Contudo, todos estes problemas estão prestes a desaparecer com o lançamento da Money API, que virá junto com a nona versão do Java, com lançamento previsto para o ano de 2016.
A Money API é representada pela JSR 354 e vem para simplificar esta árdua tarefa. Deste modo, dedicaremos todo este artigo para analisar as motivações que levaram à criação desta nova JSR, assim como a instalação da Moneta (implementação de referência desta JSR) e diversos exemplos de código demonstrando como usar esta nova API desde já, sem a necessidade de aguardar o lançamento do Java 9.
A vida antes da Money API
Antes de começarmos a analisar esta nova API, vamos relembrar como manipulamos valores monetários nas atuais versões do Java. Para isso, suponha que estamos projetando uma aplicação de frente de loja, e por ser comum a soluções desse tipo, precisaremos de uma classe chamada Produto que, além de outros atributos, necessita de um campo para armazenar o preço.
Ao codificar esse atributo, logo pensamos em especificá-lo como sendo do tipo Double ou Float.
Mas, será esta uma boa prática? Em seu livro Money API (ver seção Links), Otávio Santana, um dos responsáveis por essa JSR, nos mostra que esta não é uma prática recomendável quando precisamos de valores precisos.
Este argumento também é sustentado por Joshua Bosch, em seu livro Effective Java: os tipos Double e Float foram criados para cálculos científicos e de engenharia. Quando os usamos para representar moeda, surgem alguns problemas difíceis de serem superados.
Por exemplo, suponha que o seu produto custe R$ 1,03, mas você resolveu dar um desconto de R$ 0,42 para um cliente. Qual valor você espera que esse atributo tenha após realizada esta subtração?
Exatos 0.61, correto? Mas, caso você resolva imprimir este atributo no console, verá que o valor impresso será 0.6100000000000001, conforme demonstra o código da Listagem 1. Trata-se de uma aproximação e não o valor exato que queríamos.
Listagem 1. Primeiro problema ao usar Double ou Float para valores monetários.
package br.com.devmedia;
public class DoubleFloat {
public static void main(String...args) {
System.out.println(1.03 - 0.42); // Imprime 0.6100000000000001
}
}
Você pode argumentar que basta arredondar este valor e estará tudo resolvido! Mas, isto nem sempre irá funcionar, conforme o código da Listagem 2 nos mostra.
Observe nesta listagem que usamos apenas valores simples, com apenas uma casa decimal, para fazer os cálculos, e mesmo assim o Java imprime no console o valor 0.39999999999999997, que obviamente não era o que esperávamos. O correto seria termos impresso o valor 0.40.
Ainda assim, você pode arredondar este ...
Confira outros conteúdos:
Perguntas frequentes
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.