Anotações da aula de LP2 do Ivan sobre Clonagem (24/03/2011)

2
Anotações da aula de LP2 do dia 24/03/2011 Autor: Gabriel Negrelli Garcia Clonagem Clonar um objeto (no modo raso) significa criar outro objeto a partir de um preexistente, de modo que o novo compartilhe das mesmas referências de variáveis , e, portanto, mesmos valores, do original. ATENÇÃO: Embora os objetos clone e original sejam iguais (suas variáveis tenham os mesmos valores), eles não são idênticos, pois suas referências são distintas (os dois objetos ocupam diferentes áreas na memória). Para que se possa clonar um objeto é preciso implementar a interface Cloneable. Caso ela não seja implementada, será lançada a exceção CloneNotSupportedException quando o método clone() for chamado. OBS: A Interface Cloneable é apenas um marcador que indica que o objeto é passível de clonagem. De qualquer forma, qualquer objeto no Java já tem o método clone (). Tipos de clonagem: Clonagem rasa - É aquela feita de modo padrão pelo Java ao chamarmos o método clone() de uma classe que implemente a interface Cloneable. Neste caso, como as referências das variáveis do objeto original são compartilhadas com o clone, ao alterarmos o valor de atributos que não sejam imutáveis (como Strings e tipos primitivos, que não possuem métodos como os setters) em um dos objetos, o outro também será afetado. Exemplo de cópia rasa: Aluno String nome, pront; Date data; @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } Nesse caso, caso a data seja alterada no clone, o objeto original também terá seu valor de data alterado, e vice-versa. ATENÇÃO: A alteração da data citada acima é a realizada através de data.setTime(long valor), pois caso a atribuição seja feita através do sinal de

description

Resumo da aula do professor Ivan sobre clonagem.

Transcript of Anotações da aula de LP2 do Ivan sobre Clonagem (24/03/2011)

Anotações da aula de LP2 do dia 24/03/2011 Autor: Gabriel Negrelli Garcia

Clonagem

Clonar um objeto (no modo raso) significa criar outro objeto a partir de um preexistente, de modo que o novo compartilhe das mesmas referências de variáveis, e, portanto, mesmos valores, do original. ATENÇÃO: Embora os objetos clone e original sejam iguais (suas variáveis tenham os mesmos valores), eles não são idênticos, pois suas referências são distintas (os dois objetos ocupam diferentes áreas na memória). Para que se possa clonar um objeto é preciso implementar a interface Cloneable. Caso ela não seja implementada, será lançada a exceção CloneNotSupportedException quando o método clone() for chamado. OBS: A Interface Cloneable é apenas um marcador que indica que o objeto é passível de clonagem. De qualquer forma, qualquer objeto no Java já tem o método clone ().

Tipos de clonagem: Clonagem rasa - É aquela feita de modo padrão pelo Java ao chamarmos o método clone() de uma classe que implemente a interface Cloneable. Neste caso, como as referências das variáveis do objeto original são compartilhadas com o clone, ao alterarmos o valor de atributos que não sejam imutáveis (como Strings e tipos primitivos, que não possuem métodos como os setters) em um dos objetos, o outro também será afetado. Exemplo de cópia rasa: Aluno String nome, pront; Date data; @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } Nesse caso, caso a data seja alterada no clone, o objeto original também terá seu valor de data alterado, e vice-versa. ATENÇÃO: A alteração da data citada acima é a realizada através de data.setTime(long valor), pois caso a atribuição seja feita através do sinal de

igual (‘=’), a variável passará a apontar para uma nova instância de data, e não mais a do seu clone. Clonagem profunda - Cada atributo mutável do objeto deve ganhar um clone, ou seja, uma nova instância de objeto. String e tipos primitivos (como int e long) são imutáveis, ou seja, seus conteúdos não podem ser alterados a não ser pela atribuição feita com o sinal de igual (‘=’),. Nesse caso, como para atribuir um novo valor à variável é obrigatório fazer com que ela aponte para outra referência, não há problemas de integridade com a clonagem. A imutabilidade pode ser útil, pois economiza memória, uma vez que não é necessário criar novas instâncias para cada variável. Se o objeto for mutável (tiver um método como um setter) e a cópia for profunda (as variáveis do original e da cópia não apontarem para a mesma área de memória), não haverá alterações no objeto original caso o valor presente na cópia seja alterado, e vice-versa. Exemplo de cópia profunda: Aluno String nome, pront; Date data; @Override public Object clone() throws CloneNotSupportedException{ Aluno novo = new Aluno(); novo.nome = this.nome; novo.pront = this.pront; novo.nasc = new Date(this.nasc.getTime()); //ou novo.nasc =(Date)this.nasc.clone(); return novo; } Ou ainda, para economizar código: @Override public Object clone() throws CloneNotSupportedException { Aluno novo = (Aluno)super.clone(); novo.nasc =(Date)this.nasc.clone(); return novo; } OBS: O tipo de clone usado depende da confiança em quem utilizará os dados, mas normalmente se usa a clonagem profunda. É possível enviar também o objeto diretamente, caso ele não venha a ser alterado. Coisas que não devem ser clonadas => conexão de BD, socket de redes.