Valores Wrapper

6 respostas
M

Senhores, existe a possibilidade de trocar o valor de um wrapper sem trocar sua referência?

Obrigado!
Abraços.

6 Respostas

T

Não; os wrappers, assim como java.lang.String, pertencem à categoria das classes imutáveis (ou seja, uma vez criado o valor através de seu construtor ou de uma factory, não podem ser alterados). Entretanto, as variáveis podem apontar para outros objetos se for necessário.

B

Com reflection é possível, até com String.

M

Vocês teriam algum exemplo?
Tanto das variáveis como do reflaction?

obrigado!

T

O fato de você poder fazer alguma coisa não quer dizer que você DEVA fazer a tal coisa. Uma delas é alterar, via reflection, o valor de uma classe imutável. Olhe só o que ocorreu. Como é que 3 == 99999 ? Hein? Me explique.

import java.lang.reflect.*;

class TesteInteger {
    public static void main(String[] args) throws Exception {
        Field f = Integer.class.getDeclaredField ("value");
        f.setAccessible (true);
        Integer x = new Integer (1234567);
        f.set (x, Integer.valueOf (7654321));
        System.out.println (x); // imprime 7654321
        x = Integer.valueOf (3);
        f.set (x, Integer.valueOf (99999));
        System.out.println (x); // imprime 99999
        System.out.printf ("%d%n", 3); // imprime 99999!!!!!
    }
}
T

Moral: se uma classe é imutável, é porque ela tem razão de ser assim.
Se você ficar “brincando” com reflection, é importante saber o que pode ocorrer de errado.

Se você precisa de algo que é semelhante a um java.lang.Integer, mas pode ser alterado, você pode usar:

a) Um int[] com apenas um elemento;

b) Uma classe sua, que tenha esse comportamento semelhante a java.lang.Integer (você não pode entretanto herdar de java.lang.Integer, porque ela é uma “final class”. Em vez disso, você deve herdar de java.lang.Number - o que  um pouquinho de trabalho de qualquer forma…);

c) <a href="http://java.sun.com/javase/6/docs/api/org/omg/CORBA/IntHolder.html" data-bbcode="true">org.omg.CORBA.IntHolder</a> (cuidado - como essa classe não herda de java.lang.Number, ela é inadequada para ser um substituto perfeito de java.lang.Integer.)
M

thingol:
Moral: se uma classe é imutável, é porque ela tem razão de ser assim.
Se você ficar “brincando” com reflection, é importante saber o que pode ocorrer de errado.

Se você precisa de algo que é semelhante a um java.lang.Integer, mas pode ser alterado, você pode usar:

a) Um int[] com apenas um elemento;

b) Uma classe sua, que tenha esse comportamento semelhante a java.lang.Integer (você não pode entretanto herdar de java.lang.Integer, porque ela é uma “final class”. Em vez disso, você deve herdar de java.lang.Number - o que  um pouquinho de trabalho de qualquer forma…);

c) <a href="http://java.sun.com/javase/6/docs/api/org/omg/CORBA/IntHolder.html" data-bbcode="true">org.omg.CORBA.IntHolder</a> (cuidado - como essa classe não herda de java.lang.Number, ela é inadequada para ser um substituto perfeito de java.lang.Integer.)</blockquote>

Entendi, obrigado pela explicação!
Não vou nem me atrever a brincar com reflection rsrs.

abraços.

Criado 28 de julho de 2009
Ultima resposta 29 de jul. de 2009
Respostas 6
Participantes 3