New BigDecimal() ou BigDecimal.valueOf()

Estou com um problema
Substitui todos os capos numéricos do tipo Float pro BigDecimal.
Quando o fiz, li em um post, que dizia que usando BigDecimal.valueOf(0) era melhor do que criar um novo BigDecimal (new BigDecimal()), e foi o que eu fiz, mas agora, estou com um problema.

quando vou com o Debug, e seleciono esse trecho traz a seguinte mensagem:

if( TEntrada.getBigDecimalValue().compareTo(BigDecimal.valueOf(0)) != 0) {...}

Cannot call method"valueOf" in class “java.math.BigDecimal.” The call is ambigous

Gostaria de saber o porque, e se eu posso deixar tudo como esta(BigDecimal.valueOf(valor da variável)), eu se tenho q substituir por new BigDecimal(valor da variável), e se tiver que fazer isso gastará muito mais memórias???

Use BigDecimal.ZERO em vez de BigDecimal.valueOf (0L) ou BigDecimal.valueOf (0.0).

Mas existe algum problema em estar BigDecimal.valueOf(0) ???

Se você leu a documentação (Javadoc) direitinho vai ver que BigDecimal.valueOf aceita um long ou um double, não um int.

Ora, o número 0 (não o número 0L, que é um long, ou 0.0, que é um double) é um int, e um int não é nem um long nem um double.

Quando o compilador vê que você está passando um int, ele sabe que as duas alternativas (um long ou um double) são igualmente válidas pela definição da linguagem, e por isso dá essa mensagem de erro “the call is ambiguous”.

Digamos que em vez de zero (que é um valor enlatado e pronto para uso - veja que já existe até uma constante BigDecimal.ZERO pronta) fosse o número 1234. A mensagem seria exatamente a mesma, e exatamente pela mesma razão.
Nesse caso você usaria BigDecimal.valueOf (1234L) ou BigDecimal.valueOf (1234.0).

E qual é melhor forma???
BigDecimal.ZERO
ou
BigDecimal.valueOf(0.0)
ou
BigDecimal.valueOf(0L)

Existe alguma diferença em performance???

Meça e veja.

No seu caso em particular, use BigDecimal.ZERO porque não cria nem procura nenhum objeto - o objeto já está pronto (não precisa ser recriado com “new”) e não precisa ser procurado (com “valueOf”).

e entre o new BigDecimal(100)
e BigDecimal.valueOf(100.0)
qual usar

Dica: se tiver alguma dúvida de desempenho (será que tal coisa vai levar 9 ou 9,5 nanossegundos?), teste antes, se não conseguir determinar a velocidade só de ler o fonte (que pode enganar muito).

Eu posso usar:

new BigDecimal (“100”)
BigDecimal.valueOf (100L)

etc. Na verdade não há uma diferença assim tão grande de velocidade; o que costuma dar diferenças de velocidade são outras coisas em seu código que não são fáceis de inspecionar à primeira vista, e que não são fáceis de consertar só com uma receita de bolo. E é por isso que costumo dizer: se tem dúvidas quanto à velocidade, e não for alguma coisa que seja fácil de determinar simplesmente inspecionando o fonte, faça uma medição.

[quote=viniciusbc]e entre o new BigDecimal(100)
e BigDecimal.valueOf(100.0)
qual usar[/quote]

Depende … a quantidade que vc está tentando representar aceita facções ?
Se não use 100, se sim, use 100.0.
Note que 100 é diferente de 100.0 que é diferente de 100.00

FACÇÕES???

Cara, não pense que são as facções “Mancha Verde” X “Gaviões da Fiel”. Ele quis dizer “frações” (grafia pt-BR) ou “fracções” (grafia pt-PT).

E outra pergunta, tipo, eu tenho algumas variáveis do tipo int.
Eu estou fazendo o cast dela, multiplicando por um long.
ex:

BigDecimal.valueOf(quantidade*1L)

Pode ser assim, tá errado, existe alguma forma melhor de se fazer???

cast != conversão (exceto no caso de variáveis de tipos primitivos).

Para converter um int em um long, use um cast mesmo, uai:

int quantidade = 12345;

BigInteger qtd = BigInteger.valueOf ((long) quantidade);