pq assim Double envelope= new Double(valor);
e não assim Double envelope= valor
;?
Em essência, o Java não suporta isso. É algo que poderia ser adicionado à linguagem, mas nunca foi, possivelmente por compatibilidade e para manter a arquitetura da linguagem mais simples.
Note que, internamente na JVM, double e Double (e outros tipos, como int e char) são coisas distintas. Um é um tipo primitivo (que normalmente é acessado diretamente na memória) e outro é uma classe/objeto (que é acessado indiretamente, através de referências/ponteiros). Por isso a conversão direta não é possível.
Esta resposta no SO dá mais detalhes dessa diferença e suas motivações: https://stackoverflow.com/a/27647772
Abraço.
Olha, provavelmente não entendi direito a questão, porém, no java tem Autoboxing e Unboxing, que permite fazer coisas assim:
// Autoboxing
Long a = 1L;
Double b = 0.0;
Integer c = 1;
System.out.println(a); // 1
System.out.println(b); // 0.0
System.out.println(c); // 1
// Unboxing
long a1 = a;
double b1 = b;
int c1 = c;
System.out.println(a1); // 1
System.out.println(b1); // 0.0
System.out.println(c1); // 1
Consigo obter o wrapper pelo primitivo e vice-versa.
Sinceramente, nem lembrava que isso era possível. Acho que estou ficando realmente enferrujado em Java.
Abraço.
Então, mas tipo existe alguma vantagem em encapsular o valor em uma instância ao invés de só declarar o valor diretamente?
No caso de precisar validar NULL, por exemplo. Imagine que vc tenha uma variável double salario = 0.0;
, e seu sistema precisa verificar se o salário foi informado. Veja que ele pode ser informado como zero, com isso, como identificar se realmente foi informado ou não? Basta declarar como objeto: Double salario = null;
.
Esse é um exemplo bem simplório ok.
Não há vantangens em “embrulhar” um valor explicitamente ao invés de tirar vantagem do Autoboxing.
Na verdade só há desvantagens visto que Double
tem 2 construtores, um que aceita uma String
e um que aceita um double
e ambos se tornaram obsoletos desde o Java 9 como vc pode conferir na documentação oficial:
Com a seguinte mensagem:
Deprecated.
It is rarely appropriate to use this constructor. The static factoryvalueOf(double)
is generally a better choice, as it is likely to yield significantly better space and time performance.
Sim, as coleções padrão do Java por exemplo, só comportam objetos, não tipos primitivos, então você tem que encapsular o tipo primitivo num wrapper, caso queira adicioná-lo em uma coleção.
Pode haver situações onde você espera valores null
, ao persistir em uma tabela do banco de dados por exemplo, os tipos primitivos não comportam null
.