Problemas com um objeto

3 respostas
J

Eai Galera.

Sou novo no site, estou com um problema com um objeto.

Por incrivel que pareça nunca tinha passado por isso antes, nem imaginei que iria passar.

Um exemplo bem simples de meu problema:
Tenho essa classe

public class obj {

    String name;

    public obj() {
        this.name = "Objeto1";
    }
}

Nessa vamos dizer que tenho o main:

public class run {

    public static void main(String arg[]) {

        obj primeiroObj = new obj();
        obj segundoObj = primeiroObj;
        segundoObj.name = "Objeto2";
    }
}

Vamos dizer que tenho esse trecho de código
Na minha classe run, o segundoObjeto está recebendo o primeiroObj,
Depois estou alterando a propriedade name do segundoObj, mas altera também do primeiroObj.

Tudo que altero no segundoObj altera no primeiroObj também.

Isso estária certo.

Se alguém puder me ajudar agradeço.

3 Respostas

peczenyj

maomenos.

A variavel segundoObj aponta para uma referência de primeiroObj, por isso se vc alterar o estado em uma vc reflete na outra.

Se vc quer evitar isso vc tem que criar seus objetos imutáveis (como a classe String).

por exemplo
public class Obj {

    private String name;

    public Obj(String name) {
        this.name = name;
    }
   
    public Obj setName(String name){ return new Obj(name); }
    public String getName(){return name;}
}

Nesse caso setName retorna outro objeto com o nome alterado. Brinque com este exemplo :)

J

Entendi a moral o segundoObj apenas fazia uma referencia a o primeiroObj

Valeu pela mão.

E

Outra solução é usar o método clone. Que ao invés de atribuir a referência a ao objeto, cria uma cópia do mesmo e atribui ao objeto em questão.
Para o usar o clone é necessário que a classe implemente a interface Cloneable.
O método clone retorna um Object por padrão, então é necessário que faça o cast apropriado.

Abaixo um exemplo.
Classe de interesse

public class TesteClone implements Cloneable {
    private String Nome;

    public void setNome(String Nome) {
        this.Nome = Nome;
    }

    public String getNome() {
        return Nome;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Main

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        TesteClone nome1;
        TesteClone nome2 = null;

        nome1 = new TesteClone();
        nome1.setNome("Primeiro");
        nome2 = (TesteClone) nome1.clone();

        nome2.setNome("Outro");

        System.out.println(nome1.getNome());
    }
}

No caso, fizemos a sobrecarga do método para que possamos usar ele onde precisarmos, pois o clone padrão é protected.
Se trocarmos a linha 09 do main de nome2 = (TesteClone) nome1.clone(); por nome2 = nome1; faremos a cópia por referencia, gerando o problema citado.
Espero ter ajudado.

Criado 27 de maio de 2010
Ultima resposta 27 de mai. de 2010
Respostas 3
Participantes 3