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

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.

2 curtidas

:open_mouth:

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

Abraço.

1 curtida

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

1 curtida

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.

1 curtida