Como uso o clone()

Salve povo…

pessoal, to precisando fazer uma assagem por valor de um no de uma lista encadeada, mas ela ta passando a referencia, ai, quando manipulo esses dados, a lista tb eh modificada, o q nuam eh minha intancao. Por isso, uma das possibilidades eh fazer uso do da clonagem de objetos. Mas descobri que naum sei usar… =-)
tenti usar da seuinte forma:

noAux = this.first; // primeiro no da lista principal
noAux1 = (tpImovel)noAux.clone(); //tpImovel eh a classe e esses noAux e noAux1 saum objetos dessa classe

ai, quando eu compilo, da um erro falando q clone() tem acesso protegido na classe java.lang.Object

Alguem ai ja teve esse problema ou sabe resolve-lo?

valew…
abracos

O Método clone() é protected na classe Object, isso quer dizer que esse método só é visível nas subclasses…

Para contornar essa barreira vc pode sobrescrever o método clone() nesse classe que vc quer clonar…

[quote=“Heber”]O Método clone() é protected na classe Object, isso quer dizer que esse método só é visível nas subclasses…

Para contornar essa barreira vc pode sobrescrever o método clone() nesse classe que vc quer clonar…[/quote]

Isso não é necessário… é só vc implementar Cloneable na classe que vc quer clonar.

Vai um exemplo:

public class Pessoa extends Object implements Cloneable{
    String nome;
    
    public Pessoa retornaClone () {
      try {
        return (Pessoa)this.clone();
      }
      catch (CloneNotSupportedException ex) {
        ex.printStackTrace();
        return null;
      }
    }
  }
public class Test {
    
  public static void main(String[] args) {
    Pessoa pessoa = new Pessoa();
    pessoa.nome = "JavaTeco";
    
    Pessoa pessoaClonada = pessoa.retornaClone();
    pessoaClonada.nome = "Fábio";
    
    System.out.println(pessoa.nome);
    System.out.println(pessoaClonada.nome);
    
  }
  
}

Neste exemplo eu queria clone de Pessoa. Então implementei o Cloneable. Fiz um método que retorna o seu clone… utilizei o método clone de Object. Na classe Test cria uma Pessoa e depois cria um clone dele… vc pode perceber que são objetos distintos…

blz???

Salve…

uma perguntinha: por acaso esse metodo clone so serve pra retornar copias de classes?
ou serve pra copiar objetos de subclasses tb? (peorgunta meio obvia, mas como sou novo no assunto, naum custa nada perguntar =-)
pq to usando esse codigo (da msg anterior) pra retornar um objeto de uma subclasse da classe principal, mas continua dando a mensagem de acesso protegido…

alguma ideia??

valeu

[quote=“felboing”]Salve…

uma perguntinha: por acaso esse metodo clone so serve pra retornar copias de classes?
[/quote]

Só uma correção… retorna um clone de objetos e não de classes… blz?

O método clone() clona qualquer objeto que implementa Cloneable.

Posta seu código pra gente analisar… :wink:

    public imovel ordByCodigo2ordByValor() {

	imovel listaAux = new imovel();
	tpImovel noAux = new tpImovel();	
	tpImovel noAux1 = new tpImovel();	
	noAux = this.first;
	Pausa();
	int cont = 1;

	while (noAux != null) {

	    noAux1 = retornaClone(noAux);
	    listaAux.insereOrdByValor(noAux1);
	    noAux = noAux.next;
	    System.out.println("contador "+cont);
	    cont++;
	}

	return listaAux;
    }

    public tpImovel retornaClone(tpImovel returnedNo) {
	try {
	    return (tpImovel)returnedNo.clone();
	}
	catch(CloneNotSupportedException ex) {
	    ex.printStackTrace();
	    return null;
	}
    }

observacoes
classe imovel -> principal (lista encadeada)
classe tpImovel -> subclasse de imovel (nos da lista)

naum coloquei o codigo pois o mesmo tem mais de 1000 linhas

valeu…[/code]

O método retornaClone deve ser implementado na classe que vc quer clonar… por isso que ainda esta dando este erro, vc o implementou em outra classe.

oi

ja implementei em todas as classes possiveis mais mesmo assim ta dando o mesmo problema de acesso protegido…

Humummumumumumumu… Tenho uma idéia, ve se topa? Cria vc um exemplo, igual a classe que vc falou que tem umas 1000 linhas (só que reduzida)… ai, se não der certo vc posta o código e a gente ve o que esta acontecendo…

Blz?

opa…
demorei responder mais ta aki…

naum consegui resolver, por enquanto, o meu problema com o clone(), mas arranjei um jeito pra contornar isso e me ajudar no que tava fazendo…

eu tava usando isso pra um trabalho da faculdade. Nesse meu programa, eu usava listas encadeadas. Mas eu naum estava usando a classe ja pronta LinkedList. Eu tava implementando todas os métodos que essa classe possui, por motivos de aprendizado. Ai me deparei com esse problema, que naum resolvia nem a pau, mas tudo bem…

Ai o a data de entrega tava chegando, e como tava apertado o período pois tinha mais duas matérias capetas, tava com poko tempo e usei a classe ja pronta LinkdeList, facilitando 100% o meu trabalho. Mas agora nas ferias vou voltar a mexer com isso, e achando uma solucao, posto aki… blz??

valeu pela ajuda…
abraços

Brother, sempre opte por utilizar implementações que já estão prontas, porque provavelmente estão feitas da maneira mais correta e são mais eficientes do que qualquer outra implementação que você possa fazer. No exemplo abaixo eu criei um novo método público que chama o clone e faz um cast para o tipo da minha classe, e trato a exceção que o clone lança dentro do metodo também. veja:

package app;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Clonadora {

	public static void main(String[] args) {
		HashMap<String, Object> prop = new HashMap<String, Object>();
		prop.put("vaca", new StringBuilder("malhada"));
		List<Object> coisas = new ArrayList<Object>();
		coisas.add(new StringBuilder("leite"));
		coisas.add(new StringBuilder("queijo"));
		ClasseComplexa cc = new ClasseComplexa("Classe", prop, coisas);
		ClasseComplexa cc2 = cc.getClone();
		if (cc.equals(cc2))
			System.out.println("São instâncias iguais.");
		else
			System.out.println("São instâncias diferentes.");
		if (cc == cc2)
			System.out.println("São a mesma instância.");
		else
			System.out.println("Não são a mesma instância.");
	}

	private static class ClasseComplexa implements Cloneable {

		private String nome;
		private HashMap<String, Object> propriedades;
		private List<Object> coisas;

		// construtor gerado pelo Netbeans 7.0.1
		public ClasseComplexa(String nome, HashMap<String, Object> propriedades, List<Object> coisas) {...}

		// Método público que retorna a classe do mesmo tipo.
		// e trata a exceção internamente.
		public ClasseComplexa getClone() {
			try {
				return getClass().cast(clone());
			} catch (CloneNotSupportedException ex) {
				System.err.println("CloneNotSupportedException: " + ex);
				return null;
			}
		}

		// Método gerado pelo Netbeans 7.0.1
		@Override
		public boolean equals(Object obj) {...}

		// Método gerado pelo Netbeans 7.0.1
		@Override
		public int hashCode() {...}
	}
}

[] 's