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?
[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…
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…
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…
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??
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() {...}
}
}