Senhores, existe a possibilidade de trocar o valor de um wrapper sem trocar sua referência?
Obrigado!
Abraços.
Senhores, existe a possibilidade de trocar o valor de um wrapper sem trocar sua referência?
Obrigado!
Abraços.
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.
Com reflection é possível, até com String.
Vocês teriam algum exemplo?
Tanto das variáveis como do reflaction?
obrigado!
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!!!!!
}
}
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 dá 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.)
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 dá 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.