Objetos do combo sendo alterados

7 respostas
J

Bom dia pessoal.
Estou com uma dúvida que é a seguinte:
Adiciono objetos a um JComboBox …até ai blz.
Aí eu atribuo um desses objetos selecionado no combo a uma classe do mesmo tipo e altero os valores, pois preciso adicionar em um List.
Aqui entra meu problema.
Quando pego esse objeto e altero, ele altera também o objeto do combo.
Pelo que entendi, mesmo eu criando uma nova instancia da classe, ela ainda tem referência com o objeto selecionado.
Como faço para não acontece isso.

Desde já agradeço.

7 Respostas

E

Você está alterando o objeto do combo. Pois está trabalhando sobre uma referência dele, ao que tudo indica…

Se você quer modificar os dados que obtém daquele objeto, sem alterar o objeto., gera um clone dele e trabalhe sobre ele…

U

Não é bem assim.
Quando vc cria um novo Objeto de uma Classe, utilizando o operador NEW, vc está criando uma NOVA instância dessa Classe.
Ela referencia um NOVO objeto na memória.

Vc pode estar confundindo com passagens de argumentos, que é por REFERÊNCIA.
Ou seja, toda vez que vc passar aquele objeto para algum método, vc está passando o endereço dele na memória.

Na prática:

MinhaClasse objeto = new MinhaClasse()

MinhClasse outroObjeto = objeto;

this.umMetodoQualquer( objeto );

private void um umMetodoQualquer( MinhaClasse a ) {
    //"a" , "objeto", "outroObjeto" são o mesmo OBJETO!
}

Se vc quer uma cópia desse seu objeto, sobrescreva o método clone() e o utilize.

MinhaClasse objeto = new MinhaClasse()

MinhClasse outroObjeto = (MinhaClass) objeto.clone();   //não lembro se esse cast existe ;)

//"objeto" e "outroObjeto" são objetos DIFERENTES, com os mesmo dados!

[]s

J

Me dê um exemplo de como ficaria com o método sobrescrito.

Obrigado

U

uchoaaa:

Na prática:

MinhaClasse objeto = new MinhaClasse()

MinhClasse outroObjeto = objeto;

this.umMetodoQualquer( objeto );

private void um umMetodoQualquer( MinhaClasse a ) {
    //"a" , "objeto", "outroObjeto" são o mesmo OBJETO!
}

Se vc quer uma cópia desse seu objeto, sobrescreva o método clone() e o utilize.

MinhaClasse objeto = new MinhaClasse()

MinhClasse outroObjeto = (MinhaClass) objeto.clone();   //não lembro se esse cast existe ;)

//"objeto" e "outroObjeto" são objetos DIFERENTES, com os mesmo dados!

[]s

:wink:

J

Onde está o metodo clone ?
Gostaria de ver como fica o metodo clone, o código dentro dele.

U

Clone() é um método definido em Object.
Como ele é protegido (protected) vc não terá acesso direto pelo seu objeto. Vc deve subscrevê-lo lá na sua classe, lembrando de alterar a visibilidade para public, se convir.
Nele vc deve copiar os valores para um novo objeto, que será retornado.

Algo mais ou menos assim.

public class Aluno {

	private String nome;
	private int idade;
		
	public Object clone() throws CloneNotSupportedException {
		Aluno aluno = new Aluno();
		aluno.setIdade(this.idade);
		aluno.setNome(this.nome);
		
		return aluno;
	}

        //gets, sets, construtores..
}

e

//...
public static void main(String[] args) {
		
		Aluno aluno1 = new Aluno("Fulano", 66);
		Aluno aluno2 = aluno1;		//ambos apontam para o mesmo lugar na memória!
			
		Aluno aluno3 = null;
		
		try {
			aluno3 = (Aluno) aluno1.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		
		aluno1.setNome("Sicrano");
		
		System.out.println("Nome de aluno1 = " + aluno1.getNome());
		System.out.println("Nome de aluno2 = " + aluno2.getNome());
		System.out.println("Nome de aluno3 = " + aluno3.getNome());

	}

E a saída desse programa vai ser…

Nome de aluno1 = Sicrano
Nome de aluno2 = Sicrano
Nome de aluno3 = Fulano

Sacou?!

Tem uns links aqui…

<a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html#clone()" class="onebox" target="_blank">http://java.sun.com/javase/6/docs/api/java/lang/Object.html#clone()</a>

<aside class="onebox wikipedia">
  <header class="source">
      <a href="https://en.wikipedia.org/wiki/Clone_(Java_method)" target="_blank">en.wikipedia.org</a>
  </header>
  <article class="onebox-body">
    

<h3><a href="https://en.wikipedia.org/wiki/Clone_(Java_method)" target="_blank">clone (Java method)</a></h3>


 clone() is a method in the Java programming language for object duplication. In Java, objects are manipulated through reference variables, and there is no operator for copying an object—the assignment operator duplicates the reference, not the object. The clone() method provides this missing functionality.
 Classes that want copying functionality must implement some method to do so.  To a certain extent that function is provided by "<code>Object.clone()</code>".
 clone() acts like a copy constructor.  Typic...

Espero ter ajudado agora…

[]s

J

uchoaaa, obrigado por responder…mas agora meu problema complicou…pois dentro desse objeto eu tenho um arrayList de objetos…postei no aqui no forum veja:

http://www.guj.com.br/posts/list/102768.java

Criado 5 de julho de 2008
Ultima resposta 11 de set. de 2008
Respostas 7
Participantes 3
Alura O que é Python? — um guia completo para iniciar nessa linguagem de programação Acesse agora o guia sobre Python e inicie sua jornada nessa linguagem de programação: o que é e para que serve, sua sintaxe e como iniciar nela!
Casa do Codigo Engenharia de Prompt para Devs: Um guia para aprender a... Por Ricardo Pupo Larguesa — Casa do Codigo