Java clone – deep and shallow copy-copy constructors

a clone is an exact copy of the original. Em java, significa essencialmente a capacidade de criar um objeto com estado similar ao objeto original. O método java clone() fornece esta funcionalidade.

neste post, vamos explorar a maioria dos aspectos importantes do clone Java.

Table of Contents1. What is clone?2. Java Cloneable interface and clone() method3. Shallow Copy4. Deep Copy5. Java Copy Constructors6. Deep copy with serialization7. Cloning using Apache commons8. Java clone best practices

o que é O Clone Java?

assim a clonagem é sobre a criação da cópia do objeto original. O seu significado no dicionário é : “make an identical copy of”.

Por padrão, a clonagem de java é ‘campo por campo cópia’ ou seja, como a classe objeto não tem idéia sobre a estrutura da classe sobre a qual o método clone() será invocado.

Então, JVM quando chamado para a clonagem, fazer o seguinte:

  1. Se a classe tem apenas o tipo de dados primitivos membros, em seguida, uma completamente nova cópia do objeto será criado e a referência para o novo objeto será devolvido.
  2. Se a classe contém membros de qualquer tipo de classe, então apenas as referências de objeto a esses membros são copiadas e, portanto, as referências de membro em ambos o objeto original, bem como o objeto clonado se referem ao mesmo objeto.

para além do comportamento predefinido acima, você pode sempre sobrepor este comportamento e especificar o seu próprio. Isto é feito usando o método “overching clone(). Vamos ver como se faz.

Java clonable interface and clone () method

cada linguagem que suporta clonagem de objetos tem suas próprias regras e assim faz java. Em java, SE uma classe precisa suportar a clonagem, ela tem que fazer as seguintes coisas:

  1. você deve implementar Cloneable interface.
  2. você deve sobrepor clone() método da classe de objetos.

Leia mais: Cloneable interface é dividida em java

Java docs clone() método são dadas abaixo (formatado e extrair).a primeira declaração garante que o objeto clonado terá uma atribuição de endereço de memória separada.a segunda afirmação sugere que objetos originais e clonados devem ter o mesmo tipo de classe, mas não é obrigatório.

  • terceira afirmação sugere que os objetos originais e clonados devem ser iguais usando o método igual (), mas não é obrigatório.
  • vamos entender o clone Java com exemplo. Nossa primeira classe, é de Employee classe com 3 atributos de idname e department.

    Department classe tem dois atributos – id e name.então, se precisamos clonar a classe de funcionários, então precisamos fazer algo assim.grande, clonamos com sucesso o objeto Employee. Mas, lembre-se que temos duas referências ao mesmo objeto e agora ambos vão mudar o estado do objeto em diferentes partes da aplicação. Queres ver como? Vejamos.

    Oops, mudanças de objetos clonados também são visíveis no original. Desta forma, os objetos clonados podem causar estragos no sistema, se permitido fazê-lo. Qualquer um pode vir clonar seus objetos de aplicação e fazer o que quiser. Podemos evitar isto??a resposta é Sim, podemos. Nós podemos evitar isso criando Java deep copy e usar copy constructors. Vamos aprender sobre eles mais tarde neste post. Vamos primeiro ver o que é Clonagem profunda e clonagem superficial em Java.

    Java Shallow Copy

    Shallow clone is “default implementation” in Java. In overridden clone method, if you are not cloning all the object types (not primitives), then you are making a shallow copy.

    Todos os exemplos acima são de cópia superficial única, porque não ter clonado o Department objeto Employee classe clone método. Agora, vou passar para a próxima secção onde veremos a clonagem profunda.

    Java Deep Copy

    Deep clone é o comportamento desejado na maioria dos casos. Na cópia profunda, criamos um clone que é independente do objeto original e fazer alterações no objeto clonado não deve afetar o objeto original.

    deixe ver como cópia profunda é criada em Java.

    eu modifiquei o Employee classes clone() método e adicionado o seguinte clone método Department classe.

    agora testar o nosso código de clonagem dá o resultado desejado e o nome do departamento não será modificado.

    aqui, mudar o estado do objeto clonado não afeta o objeto original.

    assim, a clonagem profunda requer a satisfação das seguintes regras –

    • não é necessário copiar separadamente as primitivas.
    • Todas as classes membros da classe original devem suportar a clonagem e no método de clonagem da classe original no contexto deve chamar super.clone() em todas as classes membros.
    • Se qualquer classe Membro não suporta Clonagem, então no método clone, deve-se criar uma nova instância dessa classe membro e copiar todos os seus atributos um por um para o novo objeto classe membro. Este novo objeto de classe membro será definido em objeto clonado.

    Leia mais: Profundidade de clonagem usando na memória de serialização

    Java Construtores de Cópia

    os construtores de Cópia especiais de construtores em uma classe que toma o argumento para o seu próprio tipo de classe. Então, quando você passa uma instância de classe para copiar o construtor, então o construtor retornará uma nova instância de classe com valores copiados da instância de argumento. Ajuda-te a clonar objectos com uma interface Clonável.

    permite ver isto por exemplo:

    public class PointOne {private Integer x;private Integer y;public PointOne(PointOne point){this.x = point.x;this.y = point.y;}}

    este método parece simples e é até que venha a herança. Quando você define uma classe se estendendo acima da classe, você precisa definir um construtor similar lá também. Na classe de crianças, você precisa copiar atributos específicos de crianças e passar o argumento para o construtor da super classe. Vamos ver como?então, estamos bem agora? Não. O problema com a herança é que o comportamento exato é identificado apenas em tempo de execução. Assim, em nosso caso, se alguma classe passou a instância de PointTwono construtor dePointOne.

    neste caso, você terá a instância de PointOne no retorno, onde você passou instância de PointTwo como argumento. Vamos ver isso em código:

    outra maneira de criar um construtor de cópia é ter métodos de fábrica estáticos. Eles tomam tipo de classe em argumento e criam uma nova instância usando outro construtor da classe. Em seguida, estes métodos de fábrica irá copiar todos os dados de Estado para nova instância de classe acabou de criar no passo anterior, e retornar esta instância atualizada.

    Java deep copy with serialization

    Serialization is another easy way of deep cloning. Neste método, você apenas serializa o objeto a ser clonado e des-serializa-o. Obviamente, o objeto que precisa ser clonado deve implementar Serializable interface.

    Antes de ir mais longe, devo advertir que esta técnica não deve ser usada de ânimo leve.

    1. Em primeiro lugar, a serialização é extremamente cara. Poderia facilmente ser cem vezes mais caro do que o método clone().
    2. Em segundo lugar, nem todos os objetos são Serializable.
    3. erceiro, fazendo uma classe Serializable é complicado e nem todas as classes podem ser confiadas para acertar.

    Leia mais: guia para implementar a serialização em Java

    Java clone – SerializationUtils

    No Apache commons, SerializationUtils classe também tem função de utilidade para uma profunda clonagem. Se se sentir interessado, siga os documentos oficiais.

    <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version></dependency>
    SomeObject cloned = org.apache.commons.lang.SerializationUtils.clone(someObject);

    Java clone melhores práticas

    1. Quando você não sabe se você pode chamar o clone() método de uma determinada classe, como você não tem certeza se ele é implementado na classe que, você pode verificar com o de verificar se a classe é instância de “Cloneable” interface como abaixo.
      if(obj1 instanceof Cloneable){ obj2 = obj1.clone();}//Dont do this. Cloneable dont have any methodsobj2 = (Cloneable)obj1.clone();
    2. nenhum construtor é chamado sobre o objeto sendo clonado. Por conseguinte, é da sua responsabilidade assegurar que todos os deputados tenham sido devidamente colocados. Além disso, se você está mantendo o controle do número de objetos no sistema, contando a invocação de construtores, você tem um novo lugar adicional para incrementar o contador.

    espero que este post tenha sido uma atualização para você e ajude-o a obter mais informações sobre o método de clones Java 8 e é o uso correto. Ele também vai ajudar na resposta a perguntas de entrevistas de clones Java.feliz aprendizagem !! este post foi útil?

    avise-nos se gostou do post. Só assim podemos melhorar.
    Sim
    Não

    Deixe uma resposta

    O seu endereço de email não será publicado. Campos obrigatórios marcados com *