Pq encapsular variáveis em instâncias de wrappers do Double por ex?

7 respostas Resolvido
Alysson_Alves1

pq assim Double envelope= new Double(valor);
e não assim Double envelope= valor;?

7 Respostas

TerraSkilll

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.

Lucas_Camara

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.

TerraSkilll

:open_mouth:

Sinceramente, nem lembrava que isso era possível. Acho que estou ficando realmente enferrujado em Java.

Abraço.

Alysson_Alves1

Então, mas tipo existe alguma vantagem em encapsular o valor em uma instância ao invés de só declarar o valor diretamente?

Lucas_Camara
Solucao aceita

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.

wldomiciano

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 factory valueOf(double) is generally a better choice, as it is likely to yield significantly better space and time performance.

staroski

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.

Criado 29 de maio de 2020
Ultima resposta 30 de mai. de 2020
Respostas 7
Participantes 5